(function () { var win = window, $ = win.jQuery; var ApiDomain = window.ApiDomain || {}; /** * prefix: api 경로 집합, * [임시 대처]일부 api는 전문몰 도메인으로 호출 해야하는 경우가 있어 옵션변경레이어 호출 시, prefix 변경하는 경우가 있음 * keyName: api response 값의 key 집합, * getApi: 상품상세 api 호출 공통 메서드 */ win.itemUris = { itemApi: '/v1/item/detail/api', // 메인 optionApi: '/v1/item/option/api', // 옵션목록 siteUitemNameApi: '/v1/item/siteitem/uitemName/api', uitemNameApi: '/v1/item/uitemName/api', // 사은품 uitemApi: '/v1/item/uitem/api', // 단품 jwUitemApi: '/api/d/items/jewelry/price', // 쥬얼리단품 reviewApi: '/v1/item/review/api', // 리뷰 qnaApi: '/v1/item/qna/api', // qna couponApi: '/api/i/items/{itemNo}/lowervends/{lowerVendNo}/coupons', // 쿠폰 } win.itemApis = { prefix: { itemApi: ApiDomain.www + itemUris.itemApi, optionApi: ApiDomain.www + itemUris.optionApi, siteUitemNameApi: ApiDomain.www + itemUris.siteUitemNameApi, uitemNameApi: ApiDomain.www + itemUris.uitemNameApi, uitemApi: ApiDomain.www + itemUris.uitemApi, jwUitemApi: ApiDomain.www + itemUris.jwUitemApi, reviewApi: ApiDomain.www + itemUris.reviewApi, qnaApi: ApiDomain.www + itemUris.qnaApi, couponApi: ApiDomain.www + itemUris.couponApi, imgPath: '//item.elandrs.com/upload' }, keyName: { itemApi: 'itemMain', optionApi: 'itemOption', uitemApi: 'uitem', qnaApi: 'qna' }, getApi: function (props) { var deferred = $.Deferred(); eAjax.get(props).done(function (response) { deferred.resolve(response); }).fail(function () { deferred.reject(); }); return deferred.promise(); } }; })(); (function (global, factory) { global = global; global.itemDetail = factory(); }(this, function () { 'use strict'; var Component = (function (isUndefined) { var win = window, $ = win.jQuery, Util = win.EB.util; /** * 옵션의 레이어가 열린 상태에서 특정레이어(예: 로그인, 입고알림) 열릴때, 닫히지 않도록 하는 메서드 */ var AllLayer = (function () { var r = { stateAttr: { opened: false }, exceptionClass: ['cp-detail-pop'], hasCondition: function ($el) { var a = this; var r = false; var hasE = (function () { var hr = false; a.exceptionClass.forEach(function (e) { if ($el.hasClass(e)) { hr = true; } }); return hr; })(); if (hasE) { r = true; } else { if ($el.find('.detail-option-section').length) { r = true; } } return r; }, getHasLayer: function (hasLayer) { var a = this; var r = hasLayer.filter(function (inst) { return !a.hasCondition(inst.INSTANCE.layerWrap); }); return r; }, build: function (e, data) { var a = this; var $layer = data.$el; var hasE = (function () { var r = false; a.exceptionClass.forEach(function (e) { if ($layer.hasClass(e)) { r = true; } }); return r; })(); if (hasE) return; var INSTANCE = $layer.data('CmLayer'); if ((INSTANCE != isUndefined) && !INSTANCE.hasOwnProperty('$$ITEMDETAILLAYER')) { INSTANCE['$$ITEMDETAILLAYER'] = true; $layer.on('layerOpenStart', function () { if (!a.hasCondition($layer)) { this.stateAttr.opened = true; } }.bind(this)); $layer.on('layerCloseAfter', function () { var hasLayer = this.getHasLayer(INSTANCE.hasLayer); if (!hasLayer.length) { this.stateAttr.opened = false; } }.bind(this)); } }, init: function () { var a = this; var $layers = $('.cm-layer'); for (var i = 0, max = $layers.length; i < max; i++) { (function (idx) { var $layer = $layers.eq(idx); var INSTANCE = $layer.data('CmLayer'); if (INSTANCE != isUndefined) { a.build(null, { $el: $layer }); } })(i); } $('body').on('CmLayerInit', this.build.bind(this)); } }; r.init(); return r; })(); function Component (container, args) { /** * datas: 생성자 호출시 값이 있으면 api 타지 않고, 해당 datas 로 구현 * navigation: * message: 문구 집합 * parentOpts: 상품상세기능레이어 용 * toolbarSync: 툴바와 싱크를 맞추는 옵션 */ var defParams = { itemNo: '2108239956', datas: null, navigation: null, toggleBtn: '[data-toggle-active]', toggleList: '[data-toggle-list]', message: { inputTxt: '문구입력', giftSoldOut: '사은품이 조기 소진되었습니다.', uitemMin: '상품은 최소 {{N}}개 이상 주문 가능합니다.', uitemMax: '상품은 최대 {{N}}개까지 주문 가능합니다.' }, parentOpts: null, toolbarSync: false, customLabel: (function () { return ('' + Math.random()).replace('.', ''); })(), classAttr: { active: 'active', disabled: 'disabled' }, customEvent: '.Component' + (new Date()).getTime() + Math.random(), on: { selectedBefore: null, selected: null, loaded: null } }; this.opts = Util.def(defParams, (args || {})); if (!(this.$el = $(container)).length) return; this.init(); }; Component.prototype = { datas: {}, jewelry: false, itemNo: null, itemTcode: null, init: function () { /** * setElements: DOM 접근을 위한 선택자 집합 * buildMakeHtml: DOM 구성을 위한 메서드 (옵션, 컬러칩, 사은품, 가격, 구성상품 등) * buildDelivery: 수령방법 선택에 따른 함수 로직 (택배배송, 매장수령) * buildProduct: 단독상품(alone), 딜상품/세트상품(bundle) 등에 따른 함수 로직 * buildParams: 공통으로 사용되는 옵션을 위한 메서드 * buildLoader: api 호출되는 시간동안 노출되는 loader 관련 메서드 * buildJwForm: 쥬얼리 관련된 DOM 구성을 위한 메서드 * buildMethods: 이벤트시 일어나는 DOM 속성 변경에 대한 메서드 * buildFocusItem: 옵션 레이어 클릭시 아웃사이드 활성화를 위한 메서드 * bindEvents: DOM 이벤트 실행 함수 집합 */ this.setElements(); this.buildMakeHtml(); this.buildDelivery(); this.buildCalendar(); this.buildProduct(); this.buildParams(); this.buildLoader(); this.buildJwForm(); this.buildMethods(); this.buildFocusItem(); this.bindEvents(true); var startUp = function (itemNo, origin, navigation) { var clone = Util.def({}, origin); // console.log(clone); this.datas[itemNo] = { origin: origin, data: clone, navigation: navigation }; this.itemNo = itemNo; this.itemTcode = clone.itemTcode; this.jewelry = clone.jwYn == 'Y'; this.product.toolbar.init(); if (clone.itemTcode == '70' || clone.itemTcode == '80') { this.product.bundle.init(itemNo); if (clone.itemTcode == '80') { this.$selectDeliveryWrap.addClass('is-hide'); } } else { this.product.alone.init(itemNo); } this.outCallback('loaded', { datas: this.datas, itemNo: itemNo }); }.bind(this); if ((this.opts.datas != null) && (this.opts.itemNo != null)) { startUp(this.opts.itemNo, this.opts.datas, this.opts.navigation); } else { this.params.getMainApi().done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data['itemDetail'][itemApis.keyName.itemApi]; var navigation = aResponse.data['itemDetail']['navigation']; startUp(origin.itemNo, origin, navigation); } }); } this.$el.data('itemDetail', this); }, setElements: function () { this.$body = $('body'); this.$productImgWrap = this.$el.find('.product-img_wrap'); this.$productInfoWrap = this.$el.find('.product-info_wrap'); this.$optionSection = this.$el.find('.detail-option-section'); this.$basicOptionWrap = this.$optionSection.find('[data-option-basicwrap]'); this.$basicGiftWrap = this.$optionSection.find('[data-gift-basicwrap]'); this.$selectOptionWrap = this.$optionSection.find('[data-option-selectwrap]'); this.$priceOptionWrap = this.$el.find('[data-option-pricewrap]'); this.$selectDeliveryWrap = this.$optionSection.find('[data-delivery-selectwrap]'); }, buildMakeHtml: function () { var _this = this; var message = this.opts.message; Util.def(this, { makehtml: { get: { optionType: function (prop) { var data = prop.data; var idx = prop.idx != isUndefined ? '_' + prop.idx : ''; var itemOptionTypeInputNo = data.itemOptionTypeInputNo; var itemOptionTypeName = data.itemOptionTypeName; var itemOptionTcode = data.itemOptionTcode; var jwTextCondition = (function () { var aJw = ['IS', 'OS']; return _this.jewelry && (aJw.indexOf(data.itemOptionTypeInputNo) != -1); })(); var soldoutLabel = 'soldoutLabel_' + prop.name + idx + '_' + itemOptionTypeInputNo + '_' + _this.opts.customLabel; var layouts = []; layouts.push('
  • '); layouts.push('
    ' + itemOptionTypeName + '
    '); layouts.push('
    '); layouts.push('
    '); // 날짜일 경우 if ((_this.calendar.instance != null) && (itemOptionTcode === '30')) { layouts.push(''); layouts.push('' + itemOptionTypeName + ' 옵션을 선택해 주세요.'); layouts.push(''); } else { layouts.push(''); layouts.push('' + itemOptionTypeName + ' 옵션을 선택해 주세요.'); layouts.push(''); layouts.push('
    '); if (!jwTextCondition) { layouts.push('
    '); layouts.push(''); layouts.push(''); layouts.push('
    '); } layouts.push('
      '); layouts.push('
      '); } layouts.push('
      '); if (itemOptionTypeName == '색상') { layouts.push(''); } layouts.push('
      '); layouts.push('
    • '); return layouts.join(''); }, optionTypes: function (props) { var g = this; var datas = props.datas; var layouts = []; datas.forEach(function (data) { layouts.push(g.optionType({ name: props.name, idx: props.idx, data: data })); }); return layouts.join(''); }, optionItem: function (prop) { var data = prop.data; var orderNum = prop.orderNum; var itemLength = prop.itemLength; var jwTextCondition = prop.jwTextCondition; if (_this.jewelry) { var itemNo = prop.itemNo; } else { var itemNo = data.itemNo; } if (_this.product.state == 'bundle') { var getData = _this.product.bundle.getData(itemNo); } else { var getData = _this.params.getData(itemNo); } var gLowerVendNo = getData.lowerVendNo; var lowerVendNo = getData.manyUitemYn == 'N' ? gLowerVendNo : data.lowerVendNo; var itemOptionName = data.itemOptionName; var itemOptionNo = data.itemOptionNo; var sellPrice = data.sellPrice; var soldoutYn = data.soldoutYn; var reWhsInNotificPossYn = data.reWhsInNotificPossYn; var standardItemOptionImageCon = data.standardItemOptionImageCon; var standardItemOptionName = data.standardItemOptionName; var jwTextAttr = jwTextCondition ? ' data-jw-option' : ''; var soldoutClass = soldoutYn == 'N' ? '' : ' class="sold_out"'; var itemOptionNameParse = itemOptionName; var layouts = []; let reWhsInLoginPromiseData = data.reWhsInLoginPromiseData; if (_this.jewelry) { var jwOptionLength = data.jwOptionLength; if (jwTextCondition && (itemOptionName != '사용안함')) { itemOptionNameParse = message.inputTxt; } layouts.push(''); } else { var itemOptionTcode = data.itemOptionTcode; // 날짜일 경우 if ((_this.calendar.instance != null) && (itemOptionTcode === '30') && (soldoutYn != 'Y')) { _this.calendar.itemLength = itemLength; _this.calendar.orderNum = prop.orderNum; _this.calendar.data.push(prop); } layouts.push(''); } if (soldoutYn == 'Y') { layouts.push(''); } else { layouts.push(''); } layouts.push(''); return layouts.join(''); }, optionItems: function (props) { var g = this; var datas = props.datas; var itemNo = props.itemNo; var getItemDatas = props.getItemDatas; var orderNum = getItemDatas != isUndefined ? getItemDatas.getItems.index(getItemDatas.willLoadElement) : null; var itemLength = getItemDatas != isUndefined ? getItemDatas.getItems.length: null; var $willLoadElement = getItemDatas.willLoadElement; var jwTextCondition = (function () { var aJw = ['IS', 'OS']; return _this.jewelry && (aJw.indexOf($willLoadElement.attr('data-itemoptiontype_inputno')) != -1); })(); if (jwTextCondition) { datas.push({ itemOptionName: '사용안함', soldoutYn: 'N' }); } var layouts = []; let reWhsInLoginPromiseData = props.reWhsInLoginPromiseData; datas.forEach(function (data) { data["reWhsInLoginPromiseData"] = reWhsInLoginPromiseData; layouts.push(g.optionItem({ data: data, itemNo: itemNo, orderNum: orderNum, itemLength: itemLength, jwTextCondition: jwTextCondition })); }); return layouts.join(''); }, optionChipItem: function (prop) { var data = prop.data; var idx = prop.idx; var optionType = prop.optionType; var standardItemOptionImageCon = data.standardItemOptionImageCon; var standardItemOptionName = data.standardItemOptionName; var soldoutYn = data.soldoutYn; var layouts = []; if (soldoutYn == 'N') { if (optionType == '색상') { if (standardItemOptionImageCon != isUndefined) { if (_this.jewelry) { var itemNo = prop.itemNo; } else { var itemNo = data.itemNo; } var lowerVendNo = data.lowerVendNo; var itemOptionName = data.itemOptionName; var itemOptionNo = data.itemOptionNo; var itemOptionTcode = data.itemOptionTcode; var itemOptionTypeInputNo = data.itemOptionTypeInputNo; var gName = idx + '_' + itemNo + '_' + itemOptionTypeInputNo; var labelName = idx + '_' + itemOptionNo + '_' + itemOptionTypeInputNo; var soldoutClass = soldoutYn == 'N' ? '' : ' class="sold_out"'; var soldoutDiable = soldoutYn == 'N' ? '' : ' disabled="disabled"'; var whiteClass = (standardItemOptionImageCon != null && standardItemOptionImageCon.toLowerCase() == '#ffffff') ? ' class="white"' : ''; layouts.push(''); layouts.push(''); layouts.push(''); layouts.push(''); } } } return layouts.join(''); }, optionChipItems: function (props) { var g = this; var datas = props.datas; var itemNo = props.itemNo; var getItemDatas = props.getItemDatas; var optionType = getItemDatas.willLoadElement.attr('data-itemoptiontype_name'); var $itemList = props.$itemList; var $itemNo = $itemList.closest('[data-item_no]'); var $compositionIdx = $itemList.closest('[data-composition_idx]'); var idx = $itemNo.attr('data-item_no'); if ($compositionIdx.length) { idx = $compositionIdx.attr('data-composition_idx'); } var layouts = []; datas.forEach(function (data) { layouts.push(g.optionChipItem({ data: data, itemNo: itemNo, idx: idx, optionType: optionType })); }); return layouts.join(''); }, itemList: function (props) { var name = props.name; var layouts = []; layouts.push('
        '); return layouts.join(''); }, giftType: function (props) { var layouts = []; layouts.push('
      • '); layouts.push('
        사은품
        '); layouts.push('
        '); layouts.push('
        '); layouts.push(''); layouts.push(''); layouts.push(''); layouts.push('
        '); layouts.push('
          '); layouts.push('
          '); layouts.push('
          '); layouts.push('
          '); layouts.push('
        • '); return layouts.join(''); }, giftItem: function (prop) { var data = prop.data; var itemNo = data.itemNo; var uitemNo = data.uitemNo; var uitemName = data.uitemName; var lowerVendNo = data.lowerVendNo; var sellEndYn = data.sellEndYn; var sellPossQty = data.sellPossQty; var soldoutClass = (sellEndYn != 'Y') && (sellPossQty > 0) ? '' : ' class="sold_out"'; var layouts = []; layouts.push(''); layouts.push(''); layouts.push(''); layouts.push('' + uitemName + ''); layouts.push(''); layouts.push(''); layouts.push(''); return layouts.join(''); }, giftItems: function (props) { var g = this; var datas = props.datas; var hasAllSoldout = (function () { var r = false; var c = 0; datas.forEach(function (d) { var sellEndYn = d.sellEndYn; var sellPossQty = d.sellPossQty; if ((sellEndYn == 'Y') || (sellPossQty < 1)) { c++; } }); if (c == datas.length) { r = true; } return r; })(); var layouts = []; if (hasAllSoldout) { layouts.push(message.giftSoldOut); } else { datas.forEach(function (data) { layouts.push(g.giftItem({ data: data })); }); } var prop = { hasAllSoldout: hasAllSoldout, html: layouts.join('') }; return prop; }, priceItem: function (props) { var gDatas = _this.datas; var data = props.data; var itemNo = props.itemNo; var delivery = props.delivery; var params = _this.params; var onlyPrice = props.onlyPrice; var getData = params.getData(itemNo); var giftCondition = (function () { if (_this.jewelry) { return !getData.itemOptionType.length; } else { return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length); } })(); if (_this.jewelry) { var $itemList = props.$itemList; var getItemDatas = params.getItemDatas($itemList); var uitemName = (function () { var r = []; var $getItems = getItemDatas.getItems; var selectedNames = getItemDatas.selectedNames; for (var gm = 0, gx = $getItems.length; gm < gx; gm++) { var $getItem = $getItems.eq(gm); var key = $getItem.attr('data-itemoptiontype_name'); r.push(key + ':' + selectedNames[gm]); } return r.join(' / '); })(); var dispItemPrice = data.Price; var min = 1; } else { if (giftCondition) { var uitemName = getData.itemName; } else { var uitemName = data.uitemName; } var dispItemPrice = data.dispItemPrice; var min = data.purchasePossMiniQty; } var title = (function () { var r = []; if (delivery != isUndefined) { r.push('[' + delivery.text + '] '); } r.push(uitemName); if (props.hasOwnProperty('giftValue')) { r.push('
          '); r.push('사은품 : '); r.push(props.giftValue); } return r.join(''); })(); var reservationSendStartDt = (function () { var r = []; var origin = gDatas[props.itemNo].origin; if (origin.shipStartDayAllApplyYn === 'N') { if ('sendStartDt' in data) { const date = new Date(data.sendStartDt); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const dayNames = ['일', '월', '화', '수', '목', '금', '토']; const dayOfWeek = dayNames[date.getDay()]; r.push('' + month + '.' + day + '(' + dayOfWeek + ') 이후에 순차 발송 예정'); } } return r.join(''); })(); var oApplyMplusNProm = (function () { var r = null; if (!_this.jewelry) { const selectedItem = props.selectedItem; const applyMplusNProm = selectedItem.applyMplusNProm; if (!applyMplusNProm || JSON.stringify(applyMplusNProm) === "{}") { return r; } if ((applyMplusNProm.benefitConditionValue != null) && (applyMplusNProm.benefitValue != null)) { r = { benefitConditionValue: applyMplusNProm.benefitConditionValue, benefitValue: applyMplusNProm.benefitValue }; } } return r; })(); var price = (min * dispItemPrice); var dataItemName = (function () { var origin = gDatas[props.itemNo].origin; var r = {}; r['item_name'] = origin.itemName; r['brand_name'] = origin.brandName; r['uitem_name'] = data.uitemName; return r; })(); var layouts = []; layouts.push('
        • '); layouts.push('
          ' + title); if (reservationSendStartDt != null) { layouts.push(reservationSendStartDt); } layouts.push('
          '); layouts.push('
          '); if (oApplyMplusNProm != null) { layouts.push('
          ' + oApplyMplusNProm.benefitConditionValue + '개 구매시 ' + oApplyMplusNProm.benefitValue + '개 더 증정 (교차구매불가)
          '); } layouts.push('수량 감소'); layouts.push('수량 증가'); layouts.push(''); layouts.push('
          '); layouts.push('
          '); layouts.push('' + _this.params.getCurrency(price) + '원'); layouts.push('
          '); if (!onlyPrice) { layouts.push(''); layouts.push('delete'); layouts.push(''); } layouts.push('
        • '); return layouts.join(''); }, priceBundleItem: function (props) { var itemTcode = _this.itemTcode; var data = props.data; var delivery = props.delivery; var getData = _this.params.getData(_this.opts.itemNo); var title = (function () { var r = []; if (delivery != isUndefined) { r.push('[' + delivery.text + '] '); } data.forEach(function (item) { var itemCompositionGroupName = (function () { if (_this.itemTcode == '80') { if (getData.countRepresentPriceY <= 1) { return ''; } else { return '' + item.compositionItem.itemCompositionGroupName + ' '; } } else { return '' + item.compositionItem.itemCompositionGroupName + ' '; } })(); r.push(itemCompositionGroupName + item.selected.origin.title); if (item.selected.origin.data.hasOwnProperty('giftValue')) { r.push('사은품 : ' + item.selected.origin.data.giftValue); } }); return r.join('
          '); })(); var isJewelry = _this.jewelry; var min = (function () { if (itemTcode === '70') { return getData.purchasePossMiniQty; } else if (itemTcode === '80') { if (isJewelry) { return 1; } return data[0].selected.origin.data.purchasePossMiniQty; } })(); var oApplyMplusNProm = (function () { var r = null; if (!isJewelry) { if (itemTcode === '80') { const applyMplusNProm = data[0].selected.selectedItem.applyMplusNProm; if (!applyMplusNProm || JSON.stringify(applyMplusNProm) === "{}") { return r; } if ((applyMplusNProm.benefitConditionValue != null) && (applyMplusNProm.benefitValue != null)) { r = { benefitConditionValue: applyMplusNProm.benefitConditionValue, benefitValue: applyMplusNProm.benefitValue }; } } } return r; })(); var price = (function () { var r = 0; var priceName = (itemTcode === '70') ? 'sellPrice' : (isJewelry) ? 'Price' : 'dispItemPrice'; if (isJewelry) { r = data[0].selected.origin.data.Price; } else { data.forEach(function (item) { var d = item.selected.origin.data; r += d[priceName]; }); } var fr = 0; if (itemTcode === '70') { if (getData.ratioAmountDcode === '10' || getData.ratioAmountDcode === '20') { if (getData.ratioAmountDcode === '10') { fr = Math.round(r * (getData.ratioAmountValue / 100) / 10) * 10; } else { fr = getData.ratioAmountValue; } } } return (min * r) - (min * fr); })(); var dataItemName = (function () { var a = []; data.forEach(function (item) { var selected = item.selected; var origin = selected.origin; var itemNo = origin.itemNo; var getData = _this.product.bundle.getData(itemNo); var r = {}; if (isJewelry) { var selectedItem = origin.data.selectedItem; r['item_name'] = selectedItem.itemName; r['brand_name'] = selectedItem.brandName; r['uitem_name'] = origin.data.title; } else { r['item_name'] = getData.itemName; r['brand_name'] = getData.brandName; r['uitem_name'] = origin.data.uitemName; } a.push(r); }); return a; })(); var layouts = []; layouts.push('
        • '); layouts.push('
          ' + title + '
          '); layouts.push('
          '); if (oApplyMplusNProm != null) { layouts.push('
          ' + oApplyMplusNProm.benefitConditionValue + '개 구매시 ' + oApplyMplusNProm.benefitValue + '개 더 증정 (교차구매불가)
          '); } layouts.push('수량 감소'); layouts.push('수량 증가'); layouts.push(''); layouts.push('
          '); layouts.push('
          '); layouts.push('' + _this.params.getCurrency(price) + '원'); layouts.push('
          '); layouts.push(''); layouts.push('delete'); layouts.push(''); layouts.push('
        • '); return layouts.join(''); }, compositionType: function (prop) { var data = prop.data; var idx = prop.idx + 1; var itemCompositionGroupSn = prop.itemCompositionGroupSn; var itemNo = data.itemNo; var getData = _this.product.bundle.getData(itemNo); var lowerVendNo = getData.lowerVendNo; var imgUrl = prop.imgUrl; var sellPrice = data.sellPrice; var dispItemPrice = data.dispItemPrice; var sellEndYn = data.sellEndYn; var soldoutYn = data.soldoutYn; var hasSoldout = soldoutYn == 'Y' || sellEndYn == 'Y'; var soldoutClass = hasSoldout ? ' class="sold_out"' : ''; var reWhsInNotificPossYn = data.reWHSInNotificPossYn; let reWhsInLoginPromiseData = data.reWhsInLoginPromiseData; var layouts = []; var isJewelry = data.jwYn; layouts.push(''); if (hasSoldout) { layouts.push(''); } else { layouts.push(''); } layouts.push(''); return layouts.join(''); }, compositionTypes: function (props) { var g = this; var datas = props.datas; var itemCompositionGroupSn = props.itemCompositionGroupSn; var soldoutLabel = 'soldoutCompositionGroupLabel_' + itemCompositionGroupSn + '_' + _this.opts.customLabel; let reWhsInLoginPromiseData = props.reWhsInLoginPromiseData; var layouts = []; layouts.push('
        • '); layouts.push('
          상품
          '); layouts.push('
          '); layouts.push('
          '); layouts.push(''); layouts.push('상품을 선택해 주세요.'); layouts.push(''); layouts.push('
          '); layouts.push('
            '); var buildImgUrl = function (path) { var r = null; if (path != isUndefined) { var s0 = path[0]; var _imgDomain = itemApis.prefix.imgPath; var _path = path; if (s0 == 'r') { _imgDomain = win.hasOwnProperty('UIPage') && win.UIPage.hasOwnProperty('itemUrl') ? (win.UIPage.itemUrl + '/') : '//item.elandrs.com/'; } else { if (s0 != '/') { _imgDomain = _imgDomain + '/'; } } r = _imgDomain + _path + '?w=48'; } return r; }; datas.forEach(function (data, idx) { data["reWhsInLoginPromiseData"] = reWhsInLoginPromiseData; _this.product.bundle.compositionDatas[data.itemNo] = { data: data }; layouts.push(g.compositionType({ itemCompositionGroupSn: itemCompositionGroupSn, data: data, idx: idx, imgUrl: buildImgUrl(data.representImagePath) })); }); layouts.push('
          '); layouts.push('
          '); layouts.push(''); layouts.push(''); layouts.push('
          '); layouts.push('
          '); layouts.push('
          '); layouts.push('
          '); layouts.push('
        • '); return layouts.join(''); }, priceList: function () { var layouts = []; layouts.push('
            '); return layouts.join(''); } } } }); }, buildDelivery: function () { var _this = this; var message = this.opts.message; var $basicOptionWrap = this.$basicOptionWrap; var $selectDeliveryWrap = this.$selectDeliveryWrap; Util.def(this, { delivery: { state: { fixed: false, complete: false }, buildStoreLayer: function () { Util.def(this, { storelayer: { opened: false, obj: (function () { return $('.cp-detail-pop-sel-store'); })(), instance: null, openLayer: function (props) { if (this.instance == null) return; if (!this.opened) { this.opened = true; this.instance.opts.openerTarget = props.openerTarget; this.obj.trigger('openLayer'); } }, closeLayer: function () { if (this.instance == null) return; if (this.opened) { this.obj.trigger('closeLayer'); } }, destroy: function () { if (this.instance == null) return; this.instance.destroy(); this.instance = null; }, build: function () { if (this.instance != null || !this.obj.length) return; if (this.obj.data('CmLayer') == isUndefined) { this.instance = new CmLayer(this.obj); } else { this.instance = this.obj.data('CmLayer'); } this.instance.opts.on.layerOpenBefore = function () { this.opened = true; }.bind(this); this.instance.opts.on.layerCloseBefore = function () { if (!_this.delivery.state.complete) { var $input = _this.delivery.getStoreOpener(); $input.removeAttr('checked').prop('checked', false); } _this.delivery.state.complete = false; _this.product.toolbar.sync({ data: _this.$optionSection.html() }); }.bind(this); this.instance.opts.on.layerCloseAfter = function () { this.opened = false; }.bind(this); } } }); this.storelayer.build(); }, getStoreOpener: function () { var $el = $selectDeliveryWrap.find('input[data-id="delivery2"]'); return $el.length ? $el : null; }, checkedDelivery: function () { var r = null; var $inputs = $selectDeliveryWrap.find('input'); var $checkInput = $inputs.filter(function () { return $(this).prop('checked'); }).eq(0); if ($checkInput.length && ($checkInput.attr('data-push-type') != 'layer')) { r = { id: $checkInput.attr('id'), text: $checkInput.next().text() }; } return r; }, able: function (props) { var deferred = $.Deferred(); var deliveryChecked = this.checkedDelivery(); if (deliveryChecked != null) { deferred.resolve(deliveryChecked); } else { this.state.complete = false; } return deferred.promise(); }, changeFunc: function (e) { var $t = $(e.currentTarget); var $inputs = $selectDeliveryWrap.find('input'); $inputs.not($t).removeAttr('checked').prop('checked', false); $t.attr('checked', 'checked').prop('checked', true); var deliveryChecked = this.checkedDelivery(); if (deliveryChecked != null) { var params = _this.params; if (_this.product.state == 'alone') { var $itemList = $basicOptionWrap.find('> ul'); var getItemDatas = params.getItemDatas($itemList); var selectedNames = getItemDatas.selectedNames; var $willLoadElement = getItemDatas.willLoadElement; if ($willLoadElement == null) { if ((selectedNames != null) && (selectedNames.indexOf(message.inputTxt) == -1)) { _this.product.complete(deliveryChecked); } else if (selectedNames == null) { _this.product.onlyDelivery(deliveryChecked); } } } else { _this.product.complete(deliveryChecked); } } else { this.storelayer.openLayer({ openerTarget: this.getStoreOpener() }); } _this.product.toolbar.sync({ data: _this.$optionSection.html() }); }, bindEvents: function () { $selectDeliveryWrap.on(_this.changeEvents('change'), 'input', this.changeFunc.bind(this)); }, reset: function () { if (this.state.fixed) return; this.state.complete = false; var $inputs = $selectDeliveryWrap.find('input'); $inputs.removeAttr('checked').prop('checked', false); }, init: function () { // this.reset(); var $inputs = $selectDeliveryWrap.find('input'); if (($inputs.length == 1) && ($inputs.prop('checked') == true)) { this.state.fixed = true; } this.buildStoreLayer(); this.bindEvents(); } } }); this.delivery.init(); }, buildCalendar: function () { var _this = this; Util.def(this, { calendar: { $el: $('#CmCalendar'), instance: null, orderNum: 0, itemLength: 0, data: [], oData: {}, aData: [], $target: null, hasChange: false, reset: function () { if (this.instance == null) return; if (this.orderNum != 0) { this.data = []; this.oData = {}; this.aData = []; this.hasChange = false; } this.$inputEl.val(''); }, open: function (props) { if (this.instance == null) return; this.$target = props.$target; var aData = this.aData; var oData = this.oData; this.data.forEach(function (prop) { var itemOptionName = prop.data.itemOptionName; aData.push(itemOptionName); oData[itemOptionName] = prop.data; }); this.instance.datepicker.opts.isInvalidDate = function (date) { var df = date.format('YYYY-MM-DD'); if (aData.indexOf(df) == -1) { return true; } }; if (aData.length) { aData.sort(); this.$cdWrap.attr({ 'data-mindate': aData[0], 'data-maxdate': aData[aData.length - 1] }); } this.$el.trigger('openLayer'); }, hideCmCalendar: function () { if (this.instance == null) return; this.$cdWrap.removeAttr('data-mindate data-maxdate'); this.$cdWrap.removeData('mindate maxdate'); win.setTimeout(function () { if (!this.hasChange) { this.$inputEl.val(''); } }.bind(this), 0); }, showCmCalendar: function () { if (this.instance == null) return; if (this.orderNum != (this.itemLength -1)) return; var oData = this.oData; var dateRangePicker = this.instance.datepicker.instance.datepicker.instance; var $container = dateRangePicker.container; var $leftContainer = $container.find('.left'); var leftCalendar = dateRangePicker.leftCalendar; leftCalendar.calendar.forEach(function (rc, rIdx) { var r = rIdx; rc.forEach(function (lc, cIdx) { var c = cIdx; var df = lc.format('YYYY-MM-DD'); if (oData.hasOwnProperty(df)) { var title = 'r' + r + 'c' + c; var sellPrice = oData[df].sellPrice; var $el = $leftContainer.find('[data-title="' + title + '"]'); $el.append('' + _this.params.getCurrency(sellPrice) + ''); } }); }); }, changeCmCalendar: function (e, date) { this.hasChange = true; _this.methods.calendarCheck(date); }, build: function () { if (this.instance != null || !this.$el.length) return; if (this.$el.data('CmCalendar') == isUndefined) return; this.instance = this.$el.data('CmCalendar'); this.$cdWrap = this.$el.find('[data-calendarlayer__wrap]'); this.$inputEl = this.$cdWrap.find('input[type="text"]'); this.$el.on('hideCmCalendar.cmcalendar', this.hideCmCalendar.bind(this)); this.$el.on('showCmCalendar.cmcalendar', this.showCmCalendar.bind(this)); this.$el.on('changeCmCalendar.cmcalendar', this.changeCmCalendar.bind(this)); if ((_this.$el.data('CmLayer') != isUndefined) && (_this.$el.attr('data-cp') == 'PrdPop')) { _this.$el.on(_this.changeEvents('layerCloseBefore'), function () { this.$el.off('hideCmCalendar.cmcalendar'); this.$el.off('showCmCalendar.cmcalendar'); this.$el.off('changeCmCalendar.cmcalendar'); }.bind(this)); } } } }); this.calendar.build(); }, buildProduct: function () { var _this = this; var $basicOptionWrap = this.$basicOptionWrap; var $basicGiftWrap = this.$basicGiftWrap; var $selectDeliveryWrap = this.$selectDeliveryWrap; var $selectOptionWrap = this.$selectOptionWrap; var $priceOptionWrap = this.$priceOptionWrap; var message = this.opts.message; Util.def(this, { product: { state: null, destroy: function () { var state = this.state; this.toolbar.destroy(); if (state != null) { this[state].prices.destroy(); } }, toolbar: { opts: { toggleBtn: '[data-toggle-active]', toggleList: '[data-toggle-list]', classAttr: { active: 'active', disabled: 'disabled' }, resizeStart: null }, destroy: function () { if (!_this.opts.toolbarSync) return; this.bindEvents(false); }, init: function () { if (!_this.opts.toolbarSync) return; this.setElements(); this.buildFocusItem(); this.resizeFunc(); this.bindEvents(true); }, setElements: function () { this.$el = $('.cp-detail-cta'); this.$optWrap = this.$el.find('.on_opt_box'); this.$optControlWrap = this.$el.find('.opt_on_off_area'); this.$optionSection = this.$el.find('.detail-option-section'); this.$totalPrice = this.$el.find('[data-option-totalprice]'); }, buildFocusItem: function () { var _this = this; var classAttr = this.opts.classAttr; var $optionSection = this.$optionSection; Util.def(this, { focustoggle: { destroy: function () { var childs = $optionSection.find(_this.opts.toggleBtn); for (var i = 0, max = childs.length; i < max; i++) { var child = childs.eq(i); this.leave(child.parent(_this.opts.toggleList)); } }, leave: function (el) { if (!AllLayer.stateAttr.opened) { el.removeClass(classAttr.active); el.off('focusoutside mousedownoutside'); el.removeData('outsideEvent'); } }, setHeight: function (el) { var $wrap = _this.$optWrap; if ($wrap.length) { var $wrapOffsetTop = $wrap.offset().top; var $wrapHeight = Util.getBoundingClientRect($wrap[0]).height; var $elOffsetTop = el.offset().top; var $elHeight = Util.getBoundingClientRect(el[0]).height; var _limitOffset = $wrapOffsetTop + $wrapHeight; var _targetOffset = $elOffsetTop + $elHeight; var $scrollEl = el.find('[data-optionview-list]'); var $scrollSiblings = $scrollEl.siblings(); var _siblingsHeight = (function () { var r = 0; for (var i = 0, max = $scrollSiblings.length; i < max; i++) { var $sibling = $scrollSiblings.eq(i); var _siblingHeight = $sibling.outerHeight(true); r += _siblingHeight; } return r; })(); var borderWidth = 2; if ($scrollEl.length) { $scrollEl.css('max-height', _limitOffset - _targetOffset - _siblingsHeight - borderWidth); } } }, enter: function (el) { var f = this; if (el.data('outsideEvent') == isUndefined) { el.data('outsideEvent', 'true'); this.setHeight(el); el.addClass(classAttr.active); el.on('focusoutside mousedownoutside', function (e) { var ot = $(e.currentTarget); f.leave(ot); }); } }, scrollFocus: function (el) { var $optionList = el.find('[data-optionview-list]'); var $focusEl = $optionList.children('.focused'); if ($focusEl.length) { $optionList.scrollTop(0); var to = $focusEl.offset().top - $optionList.offset().top; $optionList.scrollTop(to); } }, click: function (el) { var child = el.parent(_this.opts.toggleList); if (child.hasClass(classAttr.disabled)) return; if (child.data('outsideEvent') == isUndefined) { this.enter(child); this.scrollFocus(child); } else { this.leave(child); } } } }); }, toggleFunc: function (e) { e.preventDefault(); var target = $(e.currentTarget); this.focustoggle.click(target); }, bindEvents: function (type) { if (!this.$optionSection.length) return; var $optionSection = this.$optionSection; if (type) { $(win).on(_this.changeEvents('resize orientationchange'), this.resizeFunc.bind(this)); $optionSection.on(_this.changeEvents('click'), this.opts.toggleBtn, this.toggleFunc.bind(this)); $optionSection.on(_this.changeEvents('click'), '[data-optionitem] [data-calendar-active]', function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $t = $(e.currentTarget); var $inputNo = $t.closest('[data-itemoptiontype_inputno]'); var $itemNo = $t.closest('[data-item_no]'); var inputNo = $inputNo.attr('data-itemoptiontype_inputno'); var itemNo = $itemNo.attr('data-item_no'); var selectorStr = '[data-item_no="' + itemNo + '"] [data-itemoptiontype_inputno="' + inputNo + '"]'; var $activeEl = _this.$optionSection.find(selectorStr); var $parentList = $activeEl.find('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-calendar-active]'); $toggleActive.trigger('click'); }); $optionSection.on(_this.changeEvents('click'), '[data-optionitem] [data-optionview-list] a', function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $t = $(e.currentTarget); var $optionNo = $t.closest('[data-option_no]'); if ($optionNo.hasClass('sold_out')) return; var $inputNo = $t.closest('[data-itemoptiontype_inputno]'); var $itemNo = $t.closest('[data-item_no]'); var $compositionIdx = $t.closest('[data-composition_idx]'); var optionNo = $optionNo.attr('data-option_no'); var inputNo = $inputNo.attr('data-itemoptiontype_inputno'); var itemNo = $itemNo.attr('data-item_no'); var selectorStr = '[data-item_no="' + itemNo + '"] [data-itemoptiontype_inputno="' + inputNo + '"] [data-option_no="' + optionNo + '"]'; if ($compositionIdx.length) { var compositionIdx = $compositionIdx.attr('data-composition_idx'); selectorStr = '[data-composition_idx="' + compositionIdx + '"] ' + selectorStr; } var $activeEl = _this.$optionSection.find(selectorStr); var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); $toggleActive.trigger('click'); $activeEl.find('a').trigger('click'); }); $optionSection.on(_this.changeEvents('click'), '[data-compositionitem] [data-optionview-list] a', function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $t = $(e.currentTarget); var $optionNo = $t.closest('[data-compositionitem_no]'); if ($optionNo.hasClass('sold_out')) return; var $itemNo = $t.closest('[data-item_no]'); var $compositionIdx = $t.closest('[data-composition_idx]'); var optionNo = $optionNo.attr('data-compositionitem_no'); var itemNo = $itemNo.attr('data-item_no'); var compositionIdx = $compositionIdx.attr('data-composition_idx'); var selectorStr = '[data-composition_idx="' + compositionIdx + '"] [data-item_no="' + itemNo + '"] [data-compositionitem_no="' + optionNo + '"]'; var $activeEl = _this.$optionSection.find(selectorStr); var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); $toggleActive.trigger('click'); $activeEl.find('a').trigger('click'); }); $optionSection.on(_this.changeEvents('click'), '[data-giftitem] [data-optionview-list] a', function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $t = $(e.currentTarget); var $optionNo = $t.closest('[data-uitem_no]'); if ($optionNo.hasClass('sold_out')) return; var $itemNo = $t.closest('[data-item_no]'); var optionNo = $optionNo.attr('data-uitem_no'); var itemNo = $itemNo.attr('data-item_no'); var selectorStr = '[data-item_no="' + itemNo + '"] [data-uitem_no="' + optionNo + '"]'; var $activeEl = _this.$basicGiftWrap.find(selectorStr); var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); $toggleActive.trigger('click'); $activeEl.find('a').trigger('click'); }); $optionSection.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', function (e) { var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var current = parseFloat($.trim($el.val())); var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize]'); $activeEl.val(current); $activeEl.attr('value', current); $activeEl.trigger('change'); }); $optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', function (e) { e.preventDefault(); var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize-minus]'); $activeEl.trigger('click'); }); $optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', function (e) { e.preventDefault(); var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-pricesize-plus]'); $activeEl.trigger('click'); }); $optionSection.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', function (e) { e.preventDefault(); var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var $activeEl = $selectOptionWrap.find('[data-priceitem][data-price-idx="' + idx + '"] [data-price-del]'); $activeEl.trigger('click'); }); $optionSection.on(_this.changeEvents('change'), '[data-optionsoldout-check]', function (e) { var $el = $(e.currentTarget); var checked = $el.prop('checked'); var $target = $el.closest('[data-options-flex]'); var $targetList = $target.find('[data-optionview-list]'); var $targetChilds = $targetList.find('>.sold_out'); if (checked) { $targetChilds.hide(); } else { $targetChilds.css('display', ''); } var basicId = $el.attr('data-basic-id'); var $activeEl = _this.$optionSection.find('input#' + basicId + ''); var $activeFlex = $activeEl.closest('[data-options-flex]'); var $activeFlexList = $activeFlex.find('[data-optionview-list]'); var $activeFlexChilds = $activeFlexList.find('>.sold_out'); $activeEl.prop('checked', checked); if (checked) { $activeEl.attr('checked', ''); $activeFlexChilds.hide(); } else { $activeEl.removeAttr('checked'); $activeFlexChilds.css('display', ''); } }); $optionSection.on(_this.changeEvents('change'), '[data-jw-text]', function (e) { var $el = $(e.currentTarget); var $child = $el.closest('[data-optionitem]'); var jwName = $child.attr('data-itemoptiontype_name'); var $activeEl = $basicOptionWrap.find('[data-optionitem][data-itemoptiontype_name="' + jwName + '"]'); $activeEl.find('[data-jw-text]').val($el.val()); $activeEl.find('[data-jw-text]').attr('value', $el.val()); }); $optionSection.on(_this.changeEvents('click'), '[data-jw-push]', function (e) { e.preventDefault(); var $el = $(e.currentTarget); var $child = $el.closest('[data-optionitem]'); var jwName = $child.attr('data-itemoptiontype_name'); var $activeEl = $basicOptionWrap.find('[data-optionitem][data-itemoptiontype_name="' + jwName + '"]'); $activeEl.find('[data-jw-push]').trigger('click'); win.setTimeout(function () { $child.find('[data-jw-text]').focus(); }, 10); }); $optionSection.on(_this.changeEvents('change'), '[data-delivery-selectwrap] input', function (e) { var $el = $(e.currentTarget); var $child = $el.closest('li'); var idx = $child.index(); var $activeEl = $selectDeliveryWrap.find('.delivery_type li').eq(idx).find('input'); $activeEl.trigger('change'); }); $optionSection.on(_this.changeEvents('click'), '[data-marketchoice-btn]', function (e) { e.preventDefault(); _this.$optionSection.find('[data-marketchoice-btn]').trigger('click'); }); } else { $(win).off(_this.changeEvents('resize orientationchange')); $optionSection.off(_this.changeEvents('click')); $optionSection.off(_this.changeEvents('change')); } }, resizeFunc: function () { this.winWidth = Util.winSize().w; if (this.opts.resizeStart == null) { this.opts.resizeStart = this.winWidth; this.resizeAnimateFunc(); } win.clearTimeout(this.resizeEndTime); this.resizeEndTime = win.setTimeout(this.resizeEndFunc.bind(this), 50); }, resizeEndFunc: function () { this.opts.resizeStart = null; this.resizeAct(); Util.cancelAFrame.call(win, this.resizeRequestFrame); }, resizeAnimateFunc: function () { // this.resizeAct(); this.resizeRequestFrame = Util.requestAFrame.call(win, this.resizeAnimateFunc.bind(this)); }, resizeAct: function () { var $wrap = this.$optWrap; var $controlWrap = this.$optControlWrap; var controlProps = (function () { return { top: $controlWrap.length ? $controlWrap.offset().top : 0, height: $controlWrap.length ? $controlWrap.outerHeight(true) : 0 } })(); var winHeight = Util.winSize().h; var scrollTop = $(win).scrollTop(); var space = (scrollTop + winHeight) - (controlProps.top + controlProps.height); if ($wrap.length) { $wrap.css('max-height', winHeight - space - controlProps.height); } }, sync: function (props) { if (!_this.opts.toolbarSync) return; var $optionSection = this.$optionSection; if (!$optionSection.length) return; var data = props.data; var $html = $(data); var optionSelectwrapScroll = $optionSection.find('[data-option-selectwrap]').scrollTop(); this.setLayout($html); $optionSection.empty().html($html); var $optionsSelectWrap = $optionSection.find('[data-option-selectwrap]'); $optionsSelectWrap.css('display', ''); if (optionSelectwrapScroll != null) { $optionsSelectWrap.scrollTop(optionSelectwrapScroll); } if (props.hasOwnProperty('totalPrice')) { this.$totalPrice.text(props.totalPrice); } $optionSection.find('.custom-loader').remove(); $optionSection.find('[data-chip-el]').remove(); }, setLayout: function ($wrap) { var $x = $('').append($wrap); var $soldoutWrap = $x.find('.option_list .chk_sld'); var $soloutInputs = $soldoutWrap.find('input'); for (var i = 0, max = $soloutInputs.length; i < max; i++) { (function (idx) { var $soloutInput = $soloutInputs.eq(idx); var attrName = $soloutInput.attr('name'); var getIdName = $soloutInput.attr('id'); var setIdName = 'Toolbar' + getIdName; $soloutInput.attr('data-basic-id', getIdName); $soloutInput.attr('name', 'Toolbar' + attrName); $soldoutWrap.find('input[id="' + getIdName + '"]').attr('id', setIdName); $soldoutWrap.find('label[for="' + getIdName + '"]').attr('for', setIdName); })(i); } var $deliveryWrap = $x.find('[data-delivery-selectwrap]'); var $deliveryInputs = $deliveryWrap.find('input'); for (var i = 0, max = $deliveryInputs.length; i < max; i++) { (function (idx) { var $deliveryInput = $deliveryInputs.eq(idx); var attrName = $deliveryInput.attr('name'); var getIdName = $deliveryInput.attr('id'); var setIdName = 'Toolbar' + getIdName; $deliveryInput.attr('data-basic-id', getIdName); $deliveryInput.attr('name', 'Toolbar' + attrName); $deliveryWrap.find('input[id="' + getIdName + '"]').attr('id', setIdName); $deliveryWrap.find('label[for="' + getIdName + '"]').attr('for', setIdName); })(i); } }, initialize: function () { if (!_this.opts.toolbarSync) return; this.$totalPrice.text(0); } }, onlyDelivery: function (deliveryProp) { var state = this.state; var prices = this[state].prices; prices.onlyDelivery({ delivery: deliveryProp }); }, complete: function (deliveryProp) { var state = this.state; var prices = this[state].prices; prices.allAddDone({ delivery: deliveryProp }); }, alone: { prices: { selectDatas: [], isSelected: function (props) { var selectDatas = this.selectDatas; var sameValue = false; selectDatas.forEach(function (data) { if (data != null) { if (JSON.stringify(data.key) == JSON.stringify(props)) { sameValue = true; } } }); return sameValue; }, change: function (e) { if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty; var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty; var sellPossQty = selectDataSave.sellPossQty; var aMin = []; if (typeof oncePurchasePossMaxQty == 'number') { aMin.push(oncePurchasePossMaxQty); } if (typeof onepPurchasePossMaxQty == 'number') { aMin.push(onepPurchasePossMaxQty); } if (typeof sellPossQty == 'number') { aMin.push(sellPossQty); } var minVal = Math.min.apply(null, aMin); var current = $.trim($el.val()); if (isNaN(current)) { current = 1; } selectDataSave.current = current; if (selectDataSave.current < selectDataSave.min) { selectDataSave.current = selectDataSave.min; } else if (selectDataSave.current > minVal) { selectDataSave.current = minVal; } this.pushData($el); }, minus: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; selectDataSave.current--; if (selectDataSave.current < selectDataSave.min) { selectDataSave.current = selectDataSave.min; win.alert(message.uitemMin.replace('{{N}}', selectDataSave.min)); } this.pushData($el); }, plus: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty; var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty; var sellPossQty = selectDataSave.sellPossQty; var aMin = []; if (typeof oncePurchasePossMaxQty == 'number') { aMin.push(oncePurchasePossMaxQty); } if (typeof onepPurchasePossMaxQty == 'number') { aMin.push(onepPurchasePossMaxQty); } if (typeof sellPossQty == 'number') { aMin.push(sellPossQty); } var minVal = Math.min.apply(null, aMin); selectDataSave.current++; if (selectDataSave.current > minVal) { selectDataSave.current = minVal; win.alert(message.uitemMax.replace('{{N}}', minVal)); } this.pushData($el); }, del: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); this.selectDatas[idx] = null; $child.remove(); this.totalPrice(); }, pushData: function ($el) { var $child = $el.closest('[data-priceitem]'); var $priceSize = $child.find('[data-pricesize]'); var $priceText = $child.find('[data-price-text]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var current = selectDataSave.current; $priceSize.val(selectDataSave.current); $priceSize.attr('value', selectDataSave.current); var itemPrice = null; if (_this.jewelry) { itemPrice = current * selectDataSave.price; } else { itemPrice = current * selectDataSave.dispItemPrice; } $priceText.text(_this.params.getCurrency(itemPrice)); $child.attr('data-itemprice', itemPrice); this.totalPrice(); }, totalPrice: function () { var selectDatas = this.selectDatas; var $childs = $selectOptionWrap.find('[data-priceitem]'); var r = 0; if (_this.jewelry) { var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'price' : $priceOptionWrap.attr('data-calculate-type'); } else { var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type'); } var build = function (data) { if (data != null) { var save = data.save; r += save.current * save[calculateType]; } }; selectDatas.forEach(function (data) { build(data); }); $priceOptionWrap.find('[data-option-totalprice]').text(_this.params.getCurrency(r)); if ($childs.length) { $priceOptionWrap.css('display', ''); } else { $selectOptionWrap.hide(); $priceOptionWrap.hide(); } _this.product.toolbar.sync({ data: _this.$optionSection.html(), totalPrice: _this.params.getCurrency(r) }); }, aloneDatas: { able: null, add: null, set: function (prop) { this.able = Util.def({}, prop); this.add = Util.def({}, prop); }, reset: function () { this.able = null; this.add = null; } }, onlyDelivery: function (props) { _this.delivery.state.complete = true; this.add(Util.def({ itemNo: _this.opts.itemNo, }, { delivery: props.delivery })); }, allAddDone: function (props) { if (this.aloneDatas.add != null) { _this.delivery.state.complete = true; this.add(Util.def({}, this.aloneDatas.add, { delivery: props.delivery })); } else { _this.delivery.state.complete = false; } }, getSelectedOptionInfos: function ($itemList) { if ($itemList === undefined || $itemList === null) { return []; } let selectedOptionInfos = []; try { $itemList.children("li").each(function () { const $this_ = $(this); const itemoptiontype_name = $this_.data("itemoptiontype_name"); if (itemoptiontype_name === '색상' || itemoptiontype_name === '사이즈') { const itemoption_no = $this_.attr("data-selected-value"); const $span_ = $this_[0].children[1].children[0].children[0].children[0]; const selected_name = $span_.textContent; let selectedOption = {}; selectedOption["optionNo"] = itemoption_no; selectedOption["optionType"] = itemoptiontype_name; selectedOption["optionValue"] = selected_name; selectedOptionInfos.push(selectedOption); } }); } catch (error) { selectedOptionInfos = []; } return selectedOptionInfos; }, jwAdd: function (props) { var done = function () { var itemNo = props.itemNo; var $itemList = props.$itemList; var params = _this.params; var getData = params.getData(itemNo); var lowerVendNo = props.lowerVendNo; let selectedOptionInfos = this.getSelectedOptionInfos($itemList); var jwData = {}; var addDone = function (origin) { var itemOpts = Util.def({}, props, { data: origin }); var cartProps = { itemNo: itemOpts.itemNo, prodCode: itemOpts.data.ProdCode, lowerVendNo: lowerVendNo, selectedOptionInfos: selectedOptionInfos, isJewelry: _this.jewelry }; var priceProps = { norPrice: itemOpts.data.NorPrice, price: itemOpts.data.Price, saleDcRate: itemOpts.data.SaleDCRate }; if (getData.itemGiftApplyYn == 'Y' && itemOpts.hasOwnProperty('gift')) { cartProps['sitemItemNo'] = itemOpts.gift.itemNo; cartProps['sitemUitemNo'] = itemOpts.gift.uitemNo; cartProps['sitemLowerVendNo'] = itemOpts.gift.lowerVendNo; } else { cartProps['sitemItemNo'] = null; cartProps['sitemUitemNo'] = null; cartProps['sitemLowerVendNo'] = null; } var priceItem = _this.makehtml.get.priceItem(itemOpts); var $priceItem = $(priceItem); $priceItem.attr('data-price-idx', this.selectDatas.length); $priceItem.attr('data-cartdata', JSON.stringify(cartProps)); $priceItem.attr('data-jwdata', jwData); var textData = params.getTextData($itemList); if (textData != null) { $priceItem.attr('data-textdata', JSON.stringify(textData)); } $priceItem.attr('data-pricedata', JSON.stringify(priceProps)); $priceItem.attr('data-deliverydata', JSON.stringify(props.delivery)); $selectOptionWrap.find('ul').prepend($priceItem); $selectOptionWrap.css('display', ''); this.selectDatas.push({ key: { itemNo: itemNo, brandCode: getData.brandCode, styleCode: getData.modelNo, selectedValues: selectedValues, selectedNames: selectedNames }, save: { oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty, onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty, sellPossQty: origin.sellPossQty, min: 1, current: 1, norPrice: origin.NorPrice, price: origin.Price } }); this.totalPrice(); _this.outCallback('selected'); }.bind(this); var dataOpts = {}; dataOpts['BrandCode'] = getData.brandCode; dataOpts['StyleCode'] = getData.modelNo; var ajaxCall = function (props) { _this.loader.options.run(); jwData = JSON.stringify(props.data); var cb = props != isUndefined && props.hasOwnProperty('complete') ? props.complete : function () {}; $.ajax({ type: 'POST', dataType: 'json', contentType: 'application/json', url: itemApis.prefix.jwUitemApi, data: jwData, headers: { 'Authorization': 'ZWxtOmdldHByaWNlMjAyMQ==' }, complete: function () { _this.loader.options.finish(); cb(); } }).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { if (aResponse.data.ResultCode == 200) { var origin = aResponse.data['Content']; if (origin != null) { addDone(origin); } } else { win.alert(aResponse.data.Message[1]); } } }); }; if (!getData.itemOptionType.length) { ajaxCall({ data: dataOpts }); } else { var getItemDatas = params.getItemDatas($itemList); var selectedValues = getItemDatas.selectedValues; var selectedNames = getItemDatas.selectedNames; var isSelected = this.isSelected({ itemNo: itemNo, brandCode: getData.brandCode, styleCode: getData.modelNo, selectedValues: selectedValues, selectedNames: selectedNames }); if (isSelected) { win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.'); _this.product.alone.gift.reset(props); } else { dataOpts['OptionCode'] = selectedValues; ajaxCall({ data: dataOpts, complete: function () { _this.product.alone.reset(props); } }); this.aloneDatas.reset(); } } }.bind(this); if (props.hasOwnProperty('delivery')) { done(); } else { this.aloneDatas.set(props); _this.delivery.able(props).done(function (deliveryProp) { Util.def(props, { delivery: deliveryProp }); done(); }.bind(this)); } }, add: function (props) { _this.delivery.storelayer.closeLayer(); if (_this.jewelry) { this.jwAdd(props); return; } var done = function () { var onlyPrice = props.hasOwnProperty('onlyPrice') ? props.onlyPrice : false; var itemNo = props.itemNo; var $itemList = props.$itemList; var params = _this.params; var getData = params.getData(itemNo); var lowerVendNo = props.lowerVendNo; let selectedOptionInfos = this.getSelectedOptionInfos($itemList); var addDone = function (origin) { var itemOpts = Util.def({}, props, { data: origin, onlyPrice: onlyPrice, selectedItem: getData }); var cartProps = { itemNo: itemOpts.itemNo, cartUitemNo: itemOpts.data.uitemNo, lowerVendNo: lowerVendNo, selectedOptionInfos: selectedOptionInfos, isJewelry: _this.jewelry }; var priceProps = { dispItemPrice: itemOpts.data.dispItemPrice, sellPrice: itemOpts.data.sellPrice }; if (getData.itemGiftApplyYn == 'Y' && itemOpts.hasOwnProperty('gift')) { cartProps['sitemItemNo'] = itemOpts.gift.itemNo; cartProps['sitemUitemNo'] = itemOpts.gift.uitemNo; cartProps['sitemLowerVendNo'] = itemOpts.gift.lowerVendNo; } else { cartProps['sitemItemNo'] = null; cartProps['sitemUitemNo'] = null; cartProps['sitemLowerVendNo'] = null; } var priceItem = _this.makehtml.get.priceItem(itemOpts); var $priceItem = $(priceItem); $priceItem.attr('data-price-idx', this.selectDatas.length); $priceItem.attr('data-cartdata', JSON.stringify(cartProps)); $priceItem.attr('data-pricedata', JSON.stringify(priceProps)); $priceItem.attr('data-deliverydata', JSON.stringify(props.delivery)); $selectOptionWrap.find('ul').prepend($priceItem); $selectOptionWrap.css('display', ''); this.selectDatas.push({ key: { itemNo: itemNo, lowerVendNo: lowerVendNo, selectedValues: selectedValues }, save: { oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty, onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty, sellPossQty: origin.sellPossQty, min: origin.purchasePossMiniQty, current: origin.purchasePossMiniQty, sellPrice: origin.sellPrice, price: origin.sellPrice, dispItemPrice: origin.dispItemPrice } }); this.totalPrice(); _this.outCallback('selected'); }.bind(this); if (!getData.itemOptionType.length) { lowerVendNo = getData.lowerVendNo; var isSelected = this.isSelected({ itemNo: itemNo, lowerVendNo: lowerVendNo }); if (isSelected) { win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.'); _this.product.alone.gift.reset(props); } else { _this.calendar.reset(); _this.loader.options.run(); itemApis.getApi({ url: itemApis.prefix.uitemApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo, immeDcBenefitValueDcode: getData.immeDcBenefitValueDcode, immeDcBenefitValue: getData.immeDcBenefitValue, immeDcMaxDcAmount: getData.immeDcMaxDcAmount, maxmembersApplyYn: getData.maxmembersApplyYn }, complete: function () { _this.loader.options.finish(); _this.delivery.reset(); } }).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data; addDone(origin); } }); } } else { var getItemDatas = params.getItemDatas($itemList); var selectedValues = getItemDatas.selectedValues; var isSelected = this.isSelected({ itemNo: itemNo, lowerVendNo: lowerVendNo, selectedValues: selectedValues }); if (isSelected) { win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.'); _this.product.alone.gift.reset(props); } else { _this.calendar.reset(); _this.loader.options.run(); itemApis.getApi({ url: itemApis.prefix.uitemApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo, itemOptionNoList: selectedValues, immeDcBenefitValueDcode: getData.immeDcBenefitValueDcode, immeDcBenefitValue: getData.immeDcBenefitValue, immeDcMaxDcAmount: getData.immeDcMaxDcAmount, maxmembersApplyYn: getData.maxmembersApplyYn }, complete: function () { _this.loader.options.finish(); _this.product.alone.reset(props); } }).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data; addDone(origin); } }); this.aloneDatas.reset(); } } }.bind(this); if (props.hasOwnProperty('delivery')) { done(); } else { this.aloneDatas.set(props); _this.delivery.able(props).done(function (deliveryProp) { Util.def(props, { delivery: deliveryProp }); done(); }.bind(this)); } }, bindEvents: function (type) { if (type) { $selectOptionWrap.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', this.change.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', this.minus.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', this.plus.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', this.del.bind(this)); } else { $selectOptionWrap.off(_this.changeEvents('change')); $selectOptionWrap.off(_this.changeEvents('click')); } }, destroy: function () { this.aloneDatas.reset(); this.bindEvents(false); }, init: function () { var priceList = _this.makehtml.get.priceList(); var $priceList = $(priceList); $selectOptionWrap.append($priceList); this.bindEvents(true); }, initialize: function () { this.destroy(); this.init(); } }, gift: { state: { soldout: false }, reset: function (props) { this.disable(props); }, run: function (props) { _this.product.alone.prices.add(Util.def(props, { $itemList: $basicOptionWrap.find('[data-item_no]') })); }, disable: function (props) { var itemNo = props.itemNo; var params = _this.params; var getData = params.getData(itemNo); if ((getData.itemGiftApplyYn == 'Y') && !this.state.soldout) { var $toggleList = $basicGiftWrap.find('[data-toggle-list]'); var $uitems = $basicGiftWrap.find('[data-uitem_no]'); $uitems.removeClass('selected'); $basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.'); $toggleList.addClass('disabled'); var giftCondition = (function () { if (_this.jewelry) { return !getData.itemOptionType.length; } else { return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length); } })(); if (giftCondition) { this.able(props); } _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } }, able: function (props) { var deferred = $.Deferred(); var itemNo = props.itemNo; var params = _this.params; var getData = params.getData(itemNo); if ((getData.itemGiftApplyYn == 'Y') && !this.state.soldout) { var $toggleList = $basicGiftWrap.find('[data-toggle-list]'); $toggleList.removeClass('disabled'); } else { deferred.resolve(); } return deferred.promise(); }, init: function (props) { var itemNo = props.itemNo; var params = _this.params; var getData = params.getData(itemNo); if (getData.itemGiftApplyYn == 'Y') { var itemList = _this.makehtml.get.itemList({ name: getData.itemNo }); var giftType = _this.makehtml.get.giftType({ name: getData.itemNo, data: getData.itemGift }); var $itemList = $(itemList); var $giftType = $(giftType); $itemList.append($giftType); $basicGiftWrap.append($itemList).css('display', ''); var giftItems = _this.makehtml.get.giftItems({ datas: getData.itemGift }); if (giftItems.hasAllSoldout) { this.state.soldout = true; var $giftItem = $basicGiftWrap.find('[data-giftitem]'); var $infoBox = $giftItem.find('.info_box'); $basicGiftWrap.find('[data-toggle-list]').remove(); $infoBox.empty().append(giftItems.html); } else { var $optionviewListDropdown = $basicGiftWrap.find('[data-optionview-list="dropdown"]'); $basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.'); $optionviewListDropdown.empty().append(giftItems.html); } } } }, initialize: function () { this.prices.selectDatas = []; $basicOptionWrap.empty(); $basicGiftWrap.empty().hide(); $selectOptionWrap.empty().hide(); $priceOptionWrap.hide(); this.init(_this.opts.itemNo); }, reset: function (props) { var $getItems = _this.params.getItems(props.$itemList); for (var gi = 0, gm = $getItems.length; gi < gm; gi++) { var $item = $getItems.eq(gi); $item.removeAttr('data-selected-value'); $item.find('[data-option-selectname]').text($item.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.'); $item.find('[data-optionview-list] li').removeClass('selected'); if (_this.jewelry) { _this.methods.jwformhide($item.find('[data-toggle-list]')); } if (gi != 0) { $item.find('[data-toggle-list]').addClass('disabled'); $item.find('[data-chip-el]').hide(); } else { $item.find('[data-chip-el]').find('input').prop('checked', false); $item.find('[data-chip-el]').find('input').removeAttr('checked'); } } _this.delivery.reset(); this.gift.reset(props); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); }, run: function (props) { var itemNo = props.itemNo; var $itemList = props.$itemList; var params = _this.params; var getData = params.getData(itemNo); var getItemDatas = params.getItemDatas($itemList); var $willLoadElement = getItemDatas.willLoadElement; this.gift.disable(props); if ($willLoadElement != null) { var lowerVendNo = getData.lowerVendNo; var parentItemNo = null; var parentItemTcode = _this.itemTcode; if (_this.opts.parentOpts != null) { if (_this.opts.parentOpts.hasOwnProperty('itemNo')) { parentItemNo = _this.opts.parentOpts.itemNo; } if (_this.opts.parentOpts.hasOwnProperty('itemTcode')) { parentItemTcode = _this.opts.parentOpts.itemTcode; } } var optionApiData = { url: itemApis.prefix.optionApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo, itemTcode: parentItemTcode }, complete: function () { _this.loader.options.finish(); } }; if (parentItemNo != null) { optionApiData.data.groupItemNo = parentItemNo; } if (_this.jewelry) { optionApiData.data.itemOptionNoList = $willLoadElement.attr('data-itemoptiontype_inputno'); } else { if (getItemDatas.selectedValues != null) { optionApiData.data.itemOptionNoList = getItemDatas.selectedValues; } } _this.calendar.reset(); _this.loader.options.run(); itemApis.getApi(optionApiData).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data[itemApis.keyName.optionApi]; var clone = Util.def({}, origin); var aClone = []; for (var ck in clone) { aClone[ck] = clone[ck]; } let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}'; var optionItems = _this.makehtml.get.optionItems({ datas: aClone, itemNo: itemNo, getItemDatas: getItemDatas, reWhsInLoginPromiseData: reWhsInLoginPromiseData }); var optionChipItems = _this.makehtml.get.optionChipItems({ datas: aClone, itemNo: itemNo, $itemList: $itemList, getItemDatas: getItemDatas }); var $optionItems = $(optionItems); var $optionChipItems = $(optionChipItems); var $toggleList = $willLoadElement.find('[data-toggle-list]'); var $optionsoldoutCheck = $willLoadElement.find('[data-optionsoldout-check]'); var $optionviewListDropdown = $willLoadElement.find('[data-optionview-list="dropdown"]'); $toggleList.removeClass('disabled'); if ($optionsoldoutCheck.prop('checked')) { $optionItems.not(':not(.sold_out)').hide(); } $optionviewListDropdown.empty().append($optionItems); if ($optionChipItems.length) { var $optionviewChip = $willLoadElement.find('[data-chip-el]'); var $optionviewListChip = $willLoadElement.find('[data-optionview-list="chip"]'); $optionviewListChip.empty().append($optionChipItems); $optionviewChip.css('display', ''); } // 옵션 비활성화 $willLoadElement.find('[data-option-selectname]').text($willLoadElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.'); _this.methods.disabledOptionNextAll($willLoadElement); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } }); } else { this.gift.able(props).done(function () { this.prices.add(props); }.bind(this)); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } }, init: function (itemNo) { _this.product.state = 'alone'; var params = _this.params; var getData = params.getData(itemNo); var props = { itemNo: itemNo }; var condition = (function () { if (_this.jewelry) { return getData.itemOptionType.length; } else { return (getData.manyUitemYn == 'Y') && (getData.itemOptionType.length); } })(); this.gift.init(props); if (condition) { var itemList = _this.makehtml.get.itemList({ name: getData.itemNo }); var optionTypes = _this.makehtml.get.optionTypes({ name: getData.itemNo, datas: getData.itemOptionType }); var $itemList = $(itemList); var $optionTypes = $(optionTypes); $itemList.append($optionTypes); $basicOptionWrap.append($itemList).css('display', ''); props.$itemList = $itemList; this.run(props); } else { $basicOptionWrap.hide(); this.gift.able(props).done(function () { if (getData.itemGiftApplyYn == 'Y') { this.prices.add(props); } else { this.prices.add(Util.def({ onlyPrice: true }, props)); } }.bind(this)); } var giftCondition = (function () { if (_this.jewelry) { return !getData.itemOptionType.length; } else { return (getData.manyUitemYn == 'N') && (!getData.itemOptionType.length); } })(); if (giftCondition) { this.gift.able(props); } this.prices.initialize(); } }, bundle: { prices: { compositionDatas: [], selectDatas: [], isSelected: function (props) { var params = _this.params; var selectDatas = this.selectDatas; var compositionDatas = props.compositionDatas; var sameValue = false; var selectDatasKey = []; selectDatas.forEach(function (data) { if (data != null) { var selectedValues = data.key.selectedValues; selectDatasKey.push(selectedValues); } }); var compositionDatasKey = []; compositionDatas.forEach(function (data) { var selected = data.selected; var $itemList = selected.$itemList; var getItemDatas = params.getItemDatas($itemList); compositionDatasKey.push($itemList.attr('data-selected-composition-value')); if (_this.jewelry) { compositionDatasKey.push(JSON.stringify(getItemDatas.selectedValues)); } else { compositionDatasKey.push(getItemDatas.selectedValues); } }); if (selectDatasKey.indexOf(compositionDatasKey.join('-')) != -1) { sameValue = true; } return sameValue; }, change: function (e) { if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty; var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty; var sellPossQty = selectDataSave.sellPossQty; var aMin = []; if (typeof oncePurchasePossMaxQty == 'number') { aMin.push(oncePurchasePossMaxQty); } if (typeof onepPurchasePossMaxQty == 'number') { aMin.push(onepPurchasePossMaxQty); } if (typeof sellPossQty == 'number') { aMin.push(sellPossQty); } var current = $.trim($el.val()); if (isNaN(current)) { current = 1; } var minVal = Math.min.apply(null, aMin); selectDataSave.current = current; if (selectDataSave.current < selectDataSave.min) { selectDataSave.current = selectDataSave.min; } else if (selectDataSave.current > minVal) { selectDataSave.current = minVal; } this.pushData($el); }, minus: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; selectDataSave.current--; if (selectDataSave.current < selectDataSave.min) { selectDataSave.current = selectDataSave.min; win.alert(message.uitemMin.replace('{{N}}', selectDataSave.min)); } this.pushData($el); }, plus: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var oncePurchasePossMaxQty = selectDataSave.oncePurchasePossMaxQty; var onepPurchasePossMaxQty = selectDataSave.onepPurchasePossMaxQty; var sellPossQty = selectDataSave.sellPossQty; var aMin = []; if (typeof oncePurchasePossMaxQty == 'number') { aMin.push(oncePurchasePossMaxQty); } if (typeof onepPurchasePossMaxQty == 'number') { aMin.push(onepPurchasePossMaxQty); } if (typeof sellPossQty == 'number') { aMin.push(sellPossQty); } var minVal = Math.min.apply(null, aMin); selectDataSave.current++; if (selectDataSave.current > minVal) { selectDataSave.current = minVal; win.alert(message.uitemMax.replace('{{N}}', minVal)); } this.pushData($el); }, del: function (e) { e.preventDefault(); if (_this.loader.options.state) return; var $el = $(e.currentTarget); var $child = $el.closest('[data-priceitem]'); var idx = $child.attr('data-price-idx'); this.selectDatas[idx] = null; $child.remove(); this.totalPrice(); }, pushData: function ($el) { var itemTcode = _this.itemTcode; var getData = _this.params.getData(_this.opts.itemNo); var $child = $el.closest('[data-priceitem]'); var $priceSize = $child.find('[data-pricesize]'); var $priceText = $child.find('[data-price-text]'); var idx = $child.attr('data-price-idx'); var selectDataSave = this.selectDatas[idx].save; var current = selectDataSave.current; var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type'); if (itemTcode == '70') { calculateType = 'sellPrice'; } var saveR = selectDataSave[calculateType]; var fr = 0; if (itemTcode == '70') { if (getData.ratioAmountDcode == '10' || getData.ratioAmountDcode == '20') { if (getData.ratioAmountDcode == '10') { fr = Math.round(saveR * (getData.ratioAmountValue / 100) / 10) * 10; } else { fr = getData.ratioAmountValue; } } } var itemPrice = (current * saveR) - (current * fr); $priceSize.val(selectDataSave.current); $priceSize.attr('value', selectDataSave.current); $priceText.text(_this.params.getCurrency(itemPrice)); $child.attr('data-itemprice', itemPrice); this.totalPrice(); }, savePriceData: function (props) { var params = _this.params; var compositionDatas = this.compositionDatas; var delivery = props.delivery; let isJewelry = _this.jewelry; var bundlePriceItems = []; var build = function (data) { bundlePriceItems.push(data); }; var isSelected = this.isSelected({ compositionDatas: compositionDatas }); if (isSelected) { win.alert('이미 추가된 옵션입니다. 수량 조절은 아래 선택사항에서 해주십시오.'); } else { compositionDatas.forEach(function (data) { build(data); }); var priceItem = _this.makehtml.get.priceBundleItem({ delivery: delivery, data: bundlePriceItems }); var $priceItem = $(priceItem); $priceItem.attr('data-price-idx', this.selectDatas.length); var selectDataPush = (function () { var r = { key: { compositionDatas: compositionDatas }, save: {} }; var dispItemPrice = 0; var sellPrice = 0; var bundleSelectedValues = []; bundlePriceItems.forEach(function (item) { var getItemDatas = params.getItemDatas(item.selected.$itemList); if (isJewelry) { dispItemPrice += item.selected.origin.data.Price; sellPrice += item.selected.origin.data.NorPrice; } else { dispItemPrice += item.selected.origin.data.dispItemPrice; sellPrice += item.selected.origin.data.sellPrice; } bundleSelectedValues.push(item.selected.$itemList.attr('data-selected-composition-value')); if (isJewelry) { bundleSelectedValues.push(JSON.stringify(getItemDatas.selectedValues)); } else { bundleSelectedValues.push(getItemDatas.selectedValues); } }); r.save.dispItemPrice = dispItemPrice; r.save.sellPrice = sellPrice; r.key.selectedValues = bundleSelectedValues.join('-'); return r; })(); if (_this.itemTcode == '70') { var activeData = _this.params.getData(_this.opts.itemNo); } else if (_this.itemTcode == '80') { var activeData = compositionDatas[0].selected.save; } if (isJewelry) { selectDataPush.save.min = 1; selectDataPush.save.current = 1; } else { selectDataPush.save.min = activeData.purchasePossMiniQty; selectDataPush.save.current = activeData.purchasePossMiniQty; } selectDataPush.save.purchasePossMiniQty = activeData.purchasePossMiniQty; selectDataPush.save.oncePurchasePossMaxQty = activeData.oncePurchasePossMaxQty; selectDataPush.save.onepPurchasePossMaxQty = activeData.onepPurchasePossMaxQty; var cartProps = []; var priceProps = []; var saveSellPossQty = []; var jwData = {}; var jwTextData = {}; compositionDatas.forEach(function (compositionData) { var compositionItem = compositionData.compositionItem; var selected = compositionData.selected; let selectedOptionInfos = selected.selectedOptionInfos; jwData = selected.origin.data.jwData; jwTextData = selected.origin.data.jwTextData; var cartData = { itemNo: selected.key.itemNo, prodCode: selected.origin.data.ProdCode, cartUitemNo: selected.key.uitemNo, lowerVendNo: selected.key.lowerVendNo, itemCompositionGroupSn: compositionItem.itemCompositionGroupSn, selectedOptionInfos: selectedOptionInfos, isJewelry: isJewelry }; var priceData = { sellPrice: isJewelry ? selected.origin.data.NorPrice : selected.origin.data.sellPrice, dispItemPrice: isJewelry ? selected.origin.data.Price : selected.origin.data.dispItemPrice }; if (selected.key.itemCompositionDetailNo != null) { cartData.itemCompositionDetailNo = selected.key.itemCompositionDetailNo; } if (selected.save.sellPossQty !== isUndefined) { saveSellPossQty.push(selected.save.sellPossQty); } cartProps.push(cartData); priceProps.push(priceData); }); selectDataPush.save.sellPossQty = Math.min.apply(null, saveSellPossQty); this.selectDatas.push(selectDataPush); if (_this.itemTcode == '70') { cartProps.forEach(function (cp) { cp['sitemItemNo'] = null; cp['sitemUitemNo'] = null; cp['sitemLowerVendNo'] = null; }); } else if (_this.itemTcode == '80') { var activeCartData = compositionDatas[0].selected.origin; if (activeCartData.data.hasOwnProperty('gift')) { cartProps[0]['sitemItemNo'] = activeCartData.data.gift.itemNo; cartProps[0]['sitemUitemNo'] = activeCartData.data.gift.uitemNo; cartProps[0]['sitemLowerVendNo'] = activeCartData.data.gift.lowerVendNo; } else { cartProps[0]['sitemItemNo'] = null; cartProps[0]['sitemUitemNo'] = null; cartProps[0]['sitemLowerVendNo'] = null; } } $priceItem.attr('data-cartdata', JSON.stringify(cartProps)); $priceItem.attr('data-pricedata', JSON.stringify(priceProps)); $priceItem.attr('data-jwdata', jwData); if (jwTextData != null) { $priceItem.attr('data-textdata', JSON.stringify(jwTextData)); } var dApi = $selectDeliveryWrap.attr('data-delivery-api'); if ((_this.itemTcode == '80') && (dApi != isUndefined)) { Util.def(delivery, JSON.parse(dApi)); } $priceItem.attr('data-deliverydata', JSON.stringify(delivery)); $selectOptionWrap.find('ul').prepend($priceItem); $selectOptionWrap.css('display', ''); _this.outCallback('selected'); _this.product.bundle.reset(); } }, totalPrice: function () { var itemTcode = _this.itemTcode; var getData = _this.params.getData(_this.opts.itemNo); var selectDatas = this.selectDatas; var $childs = $selectOptionWrap.find('[data-priceitem]'); var calculateType = $priceOptionWrap.attr('data-calculate-type') == isUndefined ? 'dispItemPrice' : $priceOptionWrap.attr('data-calculate-type'); if (itemTcode == '70') { calculateType = 'sellPrice'; } var r = 0; var build = function (data) { if (data != null) { var save = data.save; var saveR = save[calculateType]; var fr = 0; if (itemTcode == '70') { if (getData.ratioAmountDcode == '10' || getData.ratioAmountDcode == '20') { if (getData.ratioAmountDcode == '10') { fr = Math.round(saveR * (getData.ratioAmountValue / 100) / 10) * 10; } else { fr = getData.ratioAmountValue; } } } r += save.current * (saveR - fr); } }; selectDatas.forEach(function (data) { build(data); }); $priceOptionWrap.find('[data-option-totalprice]').text(_this.params.getCurrency(r)); if ($childs.length) { $priceOptionWrap.css('display', ''); } else { $selectOptionWrap.hide(); $priceOptionWrap.hide(); } _this.product.toolbar.sync({ data: _this.$optionSection.html(), totalPrice: _this.params.getCurrency(r) }); }, allAddDone: function (props) { var hasSelected = true; this.compositionDatas.forEach(function (data) { if (data.selected == null) { hasSelected = false; } }); if (hasSelected) { _this.delivery.state.complete = true; _this.delivery.storelayer.closeLayer(); if ((props != isUndefined) && props.hasOwnProperty('delivery')) { this.savePriceData({ delivery: props.delivery }); this.totalPrice(); } else { _this.delivery.able().done(function (deliveryProp) { this.savePriceData({ delivery: deliveryProp }); this.totalPrice(); }.bind(this)); } } else { _this.delivery.state.complete = false; } }, getSelectedOptionInfos: function ($itemList) { if ($itemList === undefined || $itemList === null) { return []; } let selectedOptionInfos = []; try { $itemList.children("li").each(function () { const $this_ = $(this); const itemoptiontype_name = $this_.data("itemoptiontype_name"); if (itemoptiontype_name === '색상' || itemoptiontype_name === '사이즈') { const itemoption_no = $this_.attr("data-selected-value"); const $span_ = $this_[0].children[1].children[0].children[0].children[0]; const selected_name = $span_.textContent; let selectedOption = {}; selectedOption["optionNo"] = itemoption_no; selectedOption["optionType"] = itemoptiontype_name; selectedOption["optionValue"] = selected_name; selectedOptionInfos.push(selectedOption); } }); } catch (error) { selectedOptionInfos = []; } return selectedOptionInfos; }, jwAdd: function (props) { var itemNo = props.itemNo; var $itemList = props.$itemList; var params = _this.params; var getItemDatas = params.getItemDatas($itemList); var compositionItems = _this.product.bundle.compositionItems; var getData = _this.product.bundle.getData(itemNo); var selectedValues = getItemDatas.selectedValues; var selectedNames = getItemDatas.selectedNames; var $compositionIdx = $itemList.closest('[data-composition_idx]'); var compositionIdx = $compositionIdx.attr('data-composition_idx'); var activeCompositionItem = compositionItems[compositionIdx]; var itemCompositions = activeCompositionItem.itemComposition; var jwTextData = params.getTextData($itemList); var jwData = {}; let selectedOptionInfos = this.getSelectedOptionInfos($itemList); var gift = props.hasOwnProperty("gift") ? props.gift : null; var giftValue = props.hasOwnProperty("giftValue") ? props.giftValue : null; var activeItemComposition = itemCompositions.filter(function (itemComposition) { return itemComposition.itemNo == itemNo; })[0]; var title = (function () { var r = null; var uitemName = (function () { var r = []; var $getItems = getItemDatas.getItems; var selectedNames = getItemDatas.selectedNames; for (var gm = 0, gx = $getItems.length; gm < gx; gm++) { var $getItem = $getItems.eq(gm); var key = $getItem.attr('data-itemoptiontype_name'); r.push(key + ':' + selectedNames[gm]); } return r.join(' / '); })(); var parsingNames = function () { var r = ''; if (selectedNames != null && selectedNames.length) { r = ' : ' + selectedNames.join(' : '); } return r; }; if (_this.itemTcode === '80') { if (_this.jewelry) { r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + uitemName; } else { r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames(); } } else { if (activeItemComposition.manyUitemYn === 'N') { r = activeItemComposition.itemName; } else { r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames(); } } return r; })(); var dataOpts = {}; dataOpts['BrandCode'] = getData.brandCode; dataOpts['StyleCode'] = getData.modelNo; var ajaxCall = function (props) { _this.loader.options.run(); jwData = JSON.stringify(props.data); var cb = props != isUndefined && props.hasOwnProperty('complete') ? props.complete : function () {}; var allAddDoneFunc = props != isUndefined && props.hasOwnProperty("allAddDone") ? props.allAddDone : function () {}; $.ajax({ type: 'POST', dataType: 'json', contentType: 'application/json', url: itemApis.prefix.jwUitemApi, data: jwData, headers: { 'Authorization': 'ZWxtOmdldHByaWNlMjAyMQ==' }, complete: function () { _this.loader.options.finish(); cb(); } }).done(function (response) { var aResponse = response; if ('200' === aResponse.resultCode) { if ("200" === aResponse.data.ResultCode) { var origin = aResponse.data['Content']; origin['selectedItem'] = getData; origin['jwData'] = jwData; origin['jwTextData'] = jwTextData; if (gift) { origin['gift'] = gift; } if (giftValue) { origin['giftValue'] = giftValue; } props.compositionDatas[compositionIdx].selected = { key: { itemNo: itemNo, lowerVendNo: getData.lowerVendNo, brandCode: getData.brandCode, styleCode: getData.modelNo, selectedValues: selectedValues, selectedNames: selectedNames }, save: { oncePurchasePossMaxQty: getData.oncePurchasePossMaxQty, onepPurchasePossMaxQty: getData.onepPurchasePossMaxQty, sellPossQty: origin.sellPossQty, min: 1, current: 1, norPrice: origin.NorPrice, price: origin.Price }, $itemList: $itemList, selectedOptionInfos: selectedOptionInfos, origin: Util.def({ title: title == null ? origin.uitemName : title }, props, { data: origin }) }; allAddDoneFunc(); } else { win.alert(aResponse.data.Message[1]); } } }) }; if (!getData.optionTypeName.length) { ajaxCall({ data: dataOpts, compositionDatas: this.compositionDatas, allAddDone: function () { _this.product.bundle.prices.allAddDone(); } }); } else { dataOpts['OptionCode'] = selectedValues; ajaxCall({ data: dataOpts, compositionDatas: this.compositionDatas, complete: function () { _this.product.bundle.reset(props); }, allAddDone: function () { _this.product.bundle.prices.allAddDone(); } }); } }, add: function (props) { if (_this.jewelry) { this.jwAdd(props); return; } var itemNo = props.itemNo; var $itemList = props.$itemList; var params = _this.params; var getItemDatas = params.getItemDatas($itemList); var compositionItems = _this.product.bundle.compositionItems; var getData = _this.product.bundle.getData(itemNo); var lowerVendNo = getData.manyUitemYn == 'N' ? getData.lowerVendNo : props.lowerVendNo; var selectedValues = getItemDatas.selectedValues; var selectedNames = getItemDatas.selectedNames; var $compositionIdx = $itemList.closest('[data-composition_idx]'); var compositionIdx = $compositionIdx.attr('data-composition_idx'); var activeCompositionItem = compositionItems[compositionIdx]; var itemCompositions = activeCompositionItem.itemComposition; let selectedOptionInfos = this.getSelectedOptionInfos($itemList); var activeItemComposition = itemCompositions.filter(function (itemComposition) { return itemComposition.itemNo == itemNo; })[0]; var title = (function () { var r = null; var parsingNames = function () { var r = ''; if (selectedNames != null && selectedNames.length) { r = ' : ' + selectedNames.join(' : '); } return r; }; if (_this.itemTcode == '80') { r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames(); } else { if (activeItemComposition.manyUitemYn == 'N') { r = activeItemComposition.itemName; } else { r = $itemList.find('[data-compositionitem] [data-option-selectname]').text() + parsingNames(); } } return r; })(); _this.loader.options.run(); itemApis.getApi({ url: itemApis.prefix.uitemApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo, itemOptionNoList: selectedValues, itemCompositionGroupSn: activeCompositionItem.itemCompositionGroupSn, setItemNo: _this.opts.itemNo, immeDcBenefitValueDcode: activeItemComposition.immeDcBenefitValueDcode, immeDcBenefitValue: activeItemComposition.immeDcBenefitValue, immeDcMaxDcAmount: activeItemComposition.immeDcMaxDcAmount, maxmembersApplyYn: activeItemComposition.maxmembersItemYn }, complete: function () { _this.loader.options.finish(); } }).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data; this.compositionDatas[compositionIdx].selected = { key: { itemNo: itemNo, lowerVendNo: lowerVendNo, uitemNo: origin.uitemNo, itemCompositionDetailNo: origin.hasOwnProperty('itemCompositionDetailNo') ? origin.itemCompositionDetailNo : null, selectedValues: selectedValues }, save: { min: origin.purchasePossMiniQty, current: origin.purchasePossMiniQty, purchasePossMiniQty: origin.purchasePossMiniQty, sellPossQty: origin.sellPossQty, sellPrice: origin.sellPrice, dispItemPrice: origin.dispItemPrice, price: origin.sellPrice }, $itemList: $itemList, selectedOptionInfos: selectedOptionInfos, origin: Util.def({ title: title == null ? origin.uitemName : title }, props, { data: origin }), selectedItem: activeItemComposition }; this.allAddDone(); } }.bind(this)); }, bindEvents: function (type) { if (type) { $selectOptionWrap.on(_this.changeEvents('change'), '[data-priceitem] [data-pricesize]', this.change.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-minus]', this.minus.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-pricesize-plus]', this.plus.bind(this)); $selectOptionWrap.on(_this.changeEvents('click'), '[data-priceitem] [data-price-del]', this.del.bind(this)); } else { $selectOptionWrap.off(_this.changeEvents('change')); $selectOptionWrap.off(_this.changeEvents('click')); } }, destroy: function () { this.bindEvents(false); }, init: function () { var compositionItems = _this.product.bundle.compositionItems; compositionItems.forEach(function (item, idx) { this.compositionDatas[idx] = { compositionItem: item, selected: null }; }.bind(this)); var priceList = _this.makehtml.get.priceList(); var $priceList = $(priceList); $selectOptionWrap.append($priceList); this.bindEvents(true); }, initialize: function () { this.destroy(); this.init(); } }, compositionDatas: {}, compositionItems: [], gift: { state: { soldout: false }, reset: function (props) { this.disable(props); }, run: function (props) { _this.product.bundle.prices.add(Util.def(props, { $itemList: $basicOptionWrap.find('[data-item_no]') })); }, disable: function (props) { $basicGiftWrap.empty().hide(); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); }, datas: {}, getData: function (num) { return this.datas.hasOwnProperty(num) ? this.datas[num] : null; }, able: function (props) { var deferred = $.Deferred(); var itemNo = props.itemNo; var getData = this.getData(itemNo); if ((getData != null) && getData.origin.length && !this.state.soldout) { var $toggleList = $basicGiftWrap.find('[data-toggle-list]'); $toggleList.removeClass('disabled'); } else { deferred.resolve(); } return deferred.promise(); }, init: function (props) { var deferred = $.Deferred(); var params = _this.params; var itemNo = props.itemNo; var lowerVendNo = props.lowerVendNo; itemApis.getApi({ url: itemApis.prefix.siteUitemNameApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo }, complete: function () { deferred.resolve(); } }).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data[itemApis.keyName.uitemApi]; this.datas[itemNo] = { origin: origin }; if (origin.length) { var itemList = _this.makehtml.get.itemList({ name: itemNo }); var giftType = _this.makehtml.get.giftType({ name: itemNo, data: origin }); var $itemList = $(itemList); var $giftType = $(giftType); $itemList.append($giftType); $basicGiftWrap.empty().append($itemList).css('display', ''); var giftItems = _this.makehtml.get.giftItems({ datas: origin }); if (giftItems.hasAllSoldout) { this.state.soldout = true; var $giftItem = $basicGiftWrap.find('[data-giftitem]'); var $infoBox = $giftItem.find('.info_box'); $basicGiftWrap.find('[data-toggle-list]').remove(); $infoBox.empty().append(giftItems.html); } else { this.state.soldout = false; var $optionviewListDropdown = $basicGiftWrap.find('[data-optionview-list="dropdown"]'); $basicGiftWrap.find('[data-option-selectname]').text('사은품을 선택해 주세요.'); $optionviewListDropdown.empty().append(giftItems.html); } } else { $basicGiftWrap.empty().hide(); } } }.bind(this)); return deferred.promise(); } }, initialize: function () { this.prices.selectDatas = []; var $compositions = _this.$optionSection.find('[data-composition_idx]'); $compositions.not($basicOptionWrap).remove(); $basicOptionWrap.empty().removeAttr('data-composition_idx'); $basicGiftWrap.empty().hide(); $selectOptionWrap.empty().hide(); $priceOptionWrap.hide(); this.init(_this.opts.itemNo); }, reset: function (props) { var compositionDatas = this.prices.compositionDatas; var hasSelected = true; compositionDatas.forEach(function (data) { if (data.selected == null) { hasSelected = false; } }); if (hasSelected) { var reset = function (data) { var selected = data.selected; var $itemList = selected.$itemList; var $getItems = _this.params.getItems($itemList); var $compositionItem = $itemList.find('[data-compositionitem]'); var $compositionToggleList = $compositionItem.find('[data-toggle-list]'); var $compositionToggleActive = $compositionItem.find('[data-toggle-active]'); var $compositionActiveEl = $compositionItem.find('[data-option-selectname]'); $compositionActiveEl.text('상품을 선택해 주세요.'); $compositionItem.find('[data-optionview-list] li').removeClass('selected'); $compositionToggleList.removeClass('box_prd'); $compositionToggleActive.append($compositionActiveEl); $compositionToggleActive.find('.img_prd_select').remove(); $compositionToggleActive.addClass('btn_select option'); $compositionActiveEl.removeClass('name'); for (var gi = 0, gm = $getItems.length; gi < gm; gi++) { var $item = $getItems.eq(gi); $item.removeAttr('data-selected-value'); $item.find('[data-option-selectname]').text($item.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.'); $item.find('[data-optionview-list] li').removeClass('selected'); if (_this.jewelry) { _this.methods.jwformhide($item.find('[data-toggle-list]')); } $item.find('[data-chip-el]').hide(); $item.find('[data-chip-el]').find('input').prop('checked', false); $item.find('[data-chip-el]').find('input').removeAttr('checked'); $item.find('[data-toggle-list]').addClass('disabled'); } }; compositionDatas.forEach(function (data) { reset(data); }); this.prices.compositionDatas = []; var compositionItems = _this.product.bundle.compositionItems; compositionItems.forEach(function (item, idx) { this.prices.compositionDatas[idx] = { compositionItem: item, selected: null }; }.bind(this)); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } _this.delivery.reset(); this.gift.reset(props); }, run: function (props) { var b = this; var itemNo = props.itemNo; var getData = this.getData(itemNo); var lowerVendNo = getData.lowerVendNo; var $itemList = props.$itemList; var compositionIdx = $itemList.closest('[data-composition_idx]').attr('data-composition_idx'); var compositionLowerVendNo = props.compositionLowerVendNo; var compositionDatas = this.prices.compositionDatas; var itemTcode = _this.itemTcode; var itemType = props.hasOwnProperty('itemType') ? props.itemType : null; var isDeal = (itemTcode == '80') && ((itemType != null) && (itemType == 'composition')); var params = _this.params; var getItemDatas = params.getItemDatas($itemList); var $willLoadElement = getItemDatas.willLoadElement; var runCheck = { option: false, gift: false, giftCall: false, giftAble: function () { if (this.gift && this.giftCall) { b.gift.able(props).done(function () { b.prices.add(props); }); } }, done: function () { if (this.option && this.gift) { _this.loader.options.finish(); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } } }; if (isDeal) { this.gift.init({ itemNo: itemNo, lowerVendNo: compositionLowerVendNo }).done(function (giftProps) { runCheck.gift = true; runCheck.giftAble(); runCheck.done(); }.bind(this)); } else { runCheck.gift = true; } if ($willLoadElement != null) { var parentItemNo = _this.itemNo; var parentItemTcode = _this.itemTcode; if (_this.opts.parentOpts != null) { if (_this.opts.parentOpts.hasOwnProperty('itemNo')) { parentItemNo = _this.opts.parentOpts.itemNo; } if (_this.opts.parentOpts.hasOwnProperty('itemTcode')) { parentItemTcode = _this.opts.parentOpts.itemTcode; } } var optionApiData = { url: itemApis.prefix.optionApi, data: { itemNo: itemNo, lowerVendNo: lowerVendNo, itemTcode: parentItemTcode, groupItemNo: parentItemNo }, complete: function () { runCheck.option = true; runCheck.done(); } }; if (_this.jewelry) { optionApiData.data.itemOptionNoList = $willLoadElement.attr('data-itemoptiontype_inputno'); } else { if (getItemDatas.selectedValues != null) { optionApiData.data.itemOptionNoList = getItemDatas.selectedValues; } } _this.loader.options.run(); itemApis.getApi(optionApiData).done(function (response) { var aResponse = response; if (aResponse.resultCode == 200) { var origin = aResponse.data[itemApis.keyName.optionApi]; var clone = Util.def({}, origin); var aClone = []; let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}'; for (var ck in clone) { aClone[ck] = clone[ck]; } var optionItems = _this.makehtml.get.optionItems({ datas: aClone, itemNo: itemNo, getItemDatas: getItemDatas, reWhsInLoginPromiseData: reWhsInLoginPromiseData }); var optionChipItems = _this.makehtml.get.optionChipItems({ datas: aClone, $itemList: $itemList, getItemDatas: getItemDatas }); var $optionItems = $(optionItems); var $optionChipItems = $(optionChipItems); var $toggleList = $willLoadElement.find('[data-toggle-list]'); var $optionsoldoutCheck = $willLoadElement.find('[data-optionsoldout-check]'); var $optionviewListDropdown = $willLoadElement.find('[data-optionview-list="dropdown"]'); $toggleList.removeClass('disabled'); if ($optionsoldoutCheck.prop('checked')) { $optionItems.not(':not(.sold_out)').hide(); } $optionviewListDropdown.empty().append($optionItems); if ($optionChipItems.length) { var $optionviewChip = $willLoadElement.find('[data-chip-el]'); var $optionviewListChip = $willLoadElement.find('[data-optionview-list="chip"]'); $optionviewListChip.empty().append($optionChipItems); $optionviewChip.css('display', ''); } // 옵션 비활성화 compositionDatas[compositionIdx].selected = null; $willLoadElement.find('[data-option-selectname]').text($willLoadElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.'); _this.methods.disabledOptionNextAll($willLoadElement); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } }); } else { runCheck.option = true; runCheck.giftCall = true; runCheck.giftAble(); runCheck.done(); } }, getData: function (num) { return this.compositionDatas.hasOwnProperty(num) ? this.compositionDatas[num].data : null; }, init: function (itemNo) { _this.product.state = 'bundle'; var params = _this.params; var getData = params.getData(itemNo); var compositionItems = getData.compositionItem; var $alignOptionWrap = $basicOptionWrap; let reWhsInLoginPromiseData = isLogin() ? getLoginPromiseData("rewhsin") : '{"type":"reload"}'; compositionItems.forEach(function (compositionItem, idx) { var itemCompositionGroupName = compositionItem.itemCompositionGroupName; var itemList = _this.makehtml.get.itemList({ name: getData.itemNo }); var compositionTypes = _this.makehtml.get.compositionTypes({ itemCompositionGroupSn: compositionItem.itemCompositionGroupSn, datas: compositionItem.itemComposition, reWhsInLoginPromiseData: reWhsInLoginPromiseData }); if (_this.itemTcode == '80') { if (getData.countRepresentPriceY <= 1) { itemCompositionGroupName = '딜상품'; } else { itemCompositionGroupName = compositionItem.itemCompositionGroupName; } } var $groupName = $('' + itemCompositionGroupName + ''); var $itemList = $(itemList); var $compositionTypes = $(compositionTypes); $itemList.append($compositionTypes); if (idx != 0) { $alignOptionWrap.after('
            '); $alignOptionWrap = $alignOptionWrap.next(); } $alignOptionWrap.attr('data-composition_idx', idx); $alignOptionWrap.append($groupName); $alignOptionWrap.append($itemList); }); this.compositionItems = compositionItems; this.prices.initialize(); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); } }, initialize: function () { var state = this.state; this[state].initialize(); this.toolbar.initialize(); } } }); }, buildParams: function () { var _this = this; var datas = this.datas; Util.def(this, { params: { getCurrency: function (num) { var r = Math.round(num).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); return r; }, getData: function (num) { return datas.hasOwnProperty(num) ? datas[num].data : null; }, getItems: function ($wrap) { var $items = $wrap.find('[data-optionitem]'); return $items; }, getWillLoadElement: function ($wrap) { var $items = $wrap.find('[data-optionitem]:not([data-selected-value])'); return $items.length ? $items.first() : null; }, getSelectedValues: function ($wrap) { var $items = $wrap.find('[data-optionitem][data-selected-value]'); var selectedValues = (function () { if (_this.jewelry) { var r = {}; for (var i = 0, max = $items.length; i < max; i++) { var $selectedEl = $items.eq(i); var rKey = $selectedEl.attr('data-itemoptiontype_inputno'); r[rKey] = $selectedEl.attr('data-selected-value'); } return r; } else { var r = []; for (var i = 0, max = $items.length; i < max; i++) { var $selectedEl = $items.eq(i); r.push($selectedEl.attr('data-selected-value')); } return r.join(','); } })(); return $items.length ? selectedValues : null; }, getSelectedNames: function ($wrap) { var $items = $wrap.find('[data-optionitem][data-selected-value]'); var selectedNames = (function () { var r = []; for (var i = 0, max = $items.length; i < max; i++) { var $selectedEl = $items.eq(i); var jwTextCondition = (function () { var aJw = ['IS', 'OS']; return _this.jewelry && (aJw.indexOf($selectedEl.attr('data-itemoptiontype_inputno')) != -1); })(); if (jwTextCondition && $selectedEl.attr('data-selected-text') != isUndefined) { var _text = $selectedEl.attr('data-selected-text'); } else { var _text = $selectedEl.find('[data-option-selectname]').text(); } r.push(_text); } return r; })(); return $items.length ? selectedNames : null; }, getItemDatas: function ($wrap) { var r = {}; r.getItems = this.getItems($wrap); r.willLoadElement = this.getWillLoadElement($wrap); r.selectedValues = this.getSelectedValues($wrap); r.selectedNames = this.getSelectedNames($wrap); return r; }, getJwItem: function ($wrap) { var $items = $wrap.find('[data-jwitem]'); return $items; }, getJwItemDatas: function ($wrap) { var r = {}; r.getItems = this.getJwItem($wrap); return r; }, getTextData: function ($wrap) { var $items = $wrap.find('[data-optionitem]'); var selected = (function () { var r = {}; for (var i = 0, max = $items.length; i < max; i++) { var $selectedEl = $items.eq(i); var $jwTxt = $selectedEl.find('[data-jw-text]'); if ($jwTxt.length) { var rKey = $selectedEl.attr('data-itemoptiontype_inputno'); r[rKey] = $jwTxt.val(); } } return r; })(); return Object.keys(selected).length ? selected : null; }, getMainApi: function () { var deferred = $.Deferred(); var num = _this.opts.itemNo; _this.loader.options.run(); itemApis.getApi({ url: itemApis.prefix.itemApi, data: { itemNo: num }, complete: function () { _this.loader.options.finish(); } }).done(function (response) { deferred.resolve(response); }); return deferred.promise(); } } }); }, buildLoader: function () { var $optionSection = this.$optionSection; Util.def(this, { loader: { options: { state: false, instance: null, stack: 0, destroy: function () { this.stack = 0; this.finish(); }, finish: function () { if (this.instance == null) return; if (this.stack == 0) { this.state = false; this.instance.finish(); this.instance = null; } else { this.stack--; } }, run: function () { this.state = true; if (this.instance == null) { this.instance = new win.CustomLoader($optionSection); } else { this.stack++; } } }, destroy: function () { this.options.destroy(); } } }); }, buildJwForm: function () { Util.def(this, { jwform: { get: { formbox: function (prop) { var tit = prop.tit; var maxLength = prop.maxlength; var layouts = []; layouts.push('
            '); layouts.push('
            '); layouts.push(''); layouts.push('
            '); layouts.push(''); layouts.push('
            '); return layouts.join(''); } }, set: { formbox: function (props) { var $toggleList = props.$toggleList; if ($toggleList.next('[data-form-box]').length) { $toggleList.next().find('[data-jw-text]').focus(); } else { var formbox = props.formbox; var $formbox = $(formbox); $toggleList.after($formbox); } } } } }); }, buildMethods: function () { var _this = this; var $selectDeliveryWrap = this.$selectDeliveryWrap; var $selectDeliveryList = $selectDeliveryWrap.find('.delivery_type'); Util.def(this, { methods: { jwformhide: function ($el) { var $target = $el.next('[data-form-box]'); var $optionItem = $el.closest('[data-optionitem]'); $optionItem.removeAttr('data-selected-text'); if ($target.length) { $target.remove(); } }, jwformshow: function ($el) { var product = _this.product; if (product.state == 'alone') { var prices = product[product.state].prices; prices.aloneDatas.add = null; } var $target = $el.closest('li'); var $itemList = $el.closest('[data-item_no]'); var optionNo = $target.attr('data-option_no'); var $toggleList = $target.closest('[data-toggle-list]'); var $optionItem = $target.closest('[data-optionitem]'); var $selectName = $optionItem.find('[data-option-selectname]'); var $optionviewLists = $optionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]'); for (var i = 0, max = $activeChilds.length; i < max; i++) { var $activeChild = $activeChilds.eq(i); $activeChild.siblings().removeClass('selected'); } $activeChilds.addClass('selected'); var $activeInputs = $activeChilds.find('input'); if ($activeInputs.length) { $activeInputs.prop('checked', true); } $optionItem.attr('data-selected-value', optionNo); $selectName.text($target.attr('data-value')); // 옵션 비활성화 this.disabledOptionNextAll($optionItem); var formbox = _this.jwform.get.formbox({ value: $target.attr('data-value'), maxlength: $target.attr('data-option_length') }); _this.jwform.set.formbox({ $toggleList: $toggleList, formbox: formbox }); _this.product.toolbar.sync({ data: _this.$optionSection.html() }); }, jwcheck: function ($el) { var $formbox = $el.closest('[data-form-box]'); var $jwTxt = $formbox.find('[data-jw-text]'); var $optionItem = $el.closest('[data-optionitem]'); var optionNo = $optionItem.attr('data-selected-value'); var $toggleList = $optionItem.closest('[data-toggle-list]'); var $optionviewLists = $optionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]'); $optionItem.attr('data-selected-text', $jwTxt.val()); this.itemcheck($activeChilds); }, disabledOptionNextAll: function ($alignItem) { var $disabledElements = $alignItem.nextAll(); for (var di = 0, dmax = $disabledElements.length; di < dmax; di++) { var $disabledElement = $disabledElements.eq(di); $disabledElement.removeAttr('data-selected-value'); $disabledElement.find('[data-toggle-list]').addClass('disabled'); $disabledElement.find('[data-option-selectname]').text($disabledElement.attr('data-itemoptiontype_name') + ' 옵션을 선택해 주세요.'); if (_this.jewelry) { _this.methods.jwformhide($disabledElement.find('[data-toggle-list]')); } } }, lastItemData: null, itemcheck: function ($el) { var $target = $el.closest('li'); var $itemList = $el.closest('[data-item_no]'); var optionNo = $target.attr('data-option_no'); var $optionItem = $target.closest('[data-optionitem]'); var $selectName = $optionItem.find('[data-option-selectname]'); var $optionviewLists = $optionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]'); for (var i = 0, max = $activeChilds.length; i < max; i++) { var $activeChild = $activeChilds.eq(i); $activeChild.siblings().removeClass('selected'); } $activeChilds.addClass('selected'); var $activeInputs = $activeChilds.find('input'); if ($activeInputs.length) { $activeInputs.prop('checked', true); } $optionItem.attr('data-selected-value', optionNo); $selectName.text($target.attr('data-value')); // 옵션 비활성화 this.disabledOptionNextAll($optionItem); var productOpts = { $itemList: $itemList, itemNo: $itemList.attr('data-item_no'), lowerVendNo: $target.attr('data-lowervend_no') }; if (_this.product.state == 'bundle') { productOpts.itemNo = $itemList.attr('data-selected-composition-value'); } this.lastItemData = Util.def({}, productOpts); _this.product[_this.product.state].run(productOpts); }, calendarCheck: function (date) { var $el = _this.calendar.$target; var oData = Util.def({}, _this.calendar.oData); var checkData = oData[date]; var $target = $el.closest('li'); var $itemList = $el.closest('[data-item_no]'); var optionNo = checkData.itemOptionNo; var $optionItem = $target.closest('[data-optionitem]'); var $selectName = $optionItem.find('[data-option-selectname]'); var $optionviewLists = $optionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-option_no="' + optionNo + '"]'); for (var i = 0, max = $activeChilds.length; i < max; i++) { var $activeChild = $activeChilds.eq(i); $activeChild.siblings().removeClass('selected'); } $activeChilds.addClass('selected'); var $activeInputs = $activeChilds.find('input'); if ($activeInputs.length) { $activeInputs.prop('checked', true); } $optionItem.attr('data-selected-value', optionNo); $selectName.text(checkData.itemOptionName); // 옵션 비활성화 this.disabledOptionNextAll($optionItem); var productOpts = { $itemList: $itemList, itemNo: $itemList.attr('data-item_no'), lowerVendNo: checkData.lowerVendNo }; if (_this.product.state == 'bundle') { productOpts.itemNo = $itemList.attr('data-selected-composition-value'); } this.lastItemData = Util.def({}, productOpts); _this.product[_this.product.state].run(productOpts); }, compositiondeliverychange: function (props) { if (_this.itemTcode != '80') return; var getData = _this.product.bundle.getData(props.itemNo); var presentgivePossYn = getData.presentgivePossYn; var shipFcode = getData.shipFcode; var aShipFcodes = ['10', '11', '60']; var willcallPossYn = getData.willcallPossYn; var $allChilds = $selectDeliveryList.find('>li'); var $selectEls = null; var addSelect = function ($el) { if ($selectEls != null) { $selectEls = $selectEls.add($el); } else { $selectEls = $el; } }; if (aShipFcodes.indexOf(shipFcode) != -1) { addSelect($selectDeliveryList.find('>[data-shipname="d"]')); } else if (shipFcode == '40') { addSelect($selectDeliveryList.find('>[data-shipname="e"]')); } if (willcallPossYn == 'Y') { addSelect($selectDeliveryList.find('>[data-callposs]')); } if ($selectEls != null) { $selectEls.css('display', ''); $allChilds.not($selectEls).hide(); } if (($selectEls != null) && ($selectEls.length > 1)) { $selectDeliveryWrap.removeClass('is-hide'); $selectEls.find('input').removeAttr('checked').prop('checked', false); } else { $selectDeliveryWrap.addClass('is-hide'); if ($selectEls != null) { $selectEls.find('input').attr('checked', 'checked').prop('checked', true); } } var dApi = { presentgivePossYn: presentgivePossYn, shipFcode: shipFcode, willcallPossYn: willcallPossYn }; $selectDeliveryWrap.attr('data-delivery-api', JSON.stringify(dApi)); }, compositionitemchange: function (props) { var type = props.type; var name = props.name; var idx = props.idx + 1; var $target = props.$target; var imgUrl = props.imgUrl; var $toggleList = $target.find('[data-toggle-list]'); var $toggleActive = $target.find('[data-toggle-active]'); var $activeEl = $target.find('[data-option-selectname]'); $activeEl.text('선택' + idx + ') ' + name); if (type == 'expand') { $toggleList.addClass('box_prd'); $activeEl.addClass('name'); $toggleActive.removeClass('btn_select option'); if ($toggleActive.find('.img_prd_select').length) { if (imgUrl != null) { $toggleActive.find('.img_prd_select img').attr('src', imgUrl); $toggleActive.find('.img_prd_select .thumb').css('display', ''); } else { $toggleActive.find('.img_prd_select .thumb').hide(); } } else { var layouts = []; layouts.push(''); if (imgUrl != null) { layouts.push(''); layouts.push(''); } else { layouts.push(''); layouts.push(''); var $el = $(layouts.join('')); $toggleActive.append($el); $el.append($activeEl); } } else { $toggleActive.append($activeEl); $toggleActive.find('.img_prd_select').remove(); $toggleList.removeClass('box_prd'); $activeEl.removeClass('name'); $toggleActive.addClass('btn_select option'); } }, compositionitemcheck: function ($el) { var compositionItems = _this.product.bundle.compositionItems; var $itemNo = $el.closest('[data-item_no]'); var $compositionItem = $el.closest('[data-compositionitem]'); var $compositionIdx = $el.closest('[data-composition_idx]'); var compositionIdx = $compositionIdx.attr('data-composition_idx'); var $compositionItemNo = $el.closest('[data-compositionitem_no]'); var compositionItemNo = $compositionItemNo.attr('data-compositionitem_no'); var compositionLowerVendNo = $compositionItemNo.attr('data-lowervend_no'); var compositionItemNoIdx = $compositionItemNo.index(); var compositionItem = compositionItems[compositionIdx].itemComposition[compositionItemNoIdx]; var $optionviewLists = $compositionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-compositionitem_no="' + compositionItemNo + '"]'); var $isJewelry = $el.closest('[data-is_jewelry]'); var isJewelry = $isJewelry.attr('data-is_jewelry'); _this.jewelry = 'Y' === isJewelry; for (var i = 0, max = $activeChilds.length; i < max; i++) { var $activeChild = $activeChilds.eq(i); $activeChild.siblings().removeClass('selected'); } $activeChilds.addClass('selected'); var optionTypes = _this.makehtml.get.optionTypes({ name: compositionItem.itemNo, idx: compositionIdx, datas: compositionItem.optionTypeName }); var $optionTypes = $(optionTypes); $itemNo.attr('data-selected-composition-value', compositionItemNo); $itemNo.find('[data-optionitem]').remove(); $itemNo.append($optionTypes); var props = { itemType: 'composition', itemNo: compositionItemNo, $itemList: $itemNo, compositionLowerVendNo: compositionLowerVendNo }; this.compositiondeliverychange({ itemNo: compositionItemNo }); var buildImgUrl = function (path) { var r = null; if (path != isUndefined) { var s0 = path[0]; var _imgDomain = itemApis.prefix.imgPath; var _path = path; if (s0 == 'r') { _imgDomain = win.hasOwnProperty('UIPage') && win.UIPage.hasOwnProperty('itemUrl') ? (win.UIPage.itemUrl + '/') : '//item.elandrs.com/'; } else { if (s0 != '/') { _imgDomain = _imgDomain + '/'; } } r = _imgDomain + _path + '?w=48'; } return r; }; this.compositionitemchange({ type: 'expand', $target: $el.closest('[data-compositionitem]'), name: compositionItem.itemName, idx: compositionItemNoIdx, imgUrl: compositionItem.representImagePath != null ? buildImgUrl(compositionItem.representImagePath) : null }); _this.product.bundle.run(props); }, giftcheck: function ($el) { var $target = $el.closest('li'); var $itemNo = $target.closest('[data-item_no]'); var itemNo = $itemNo.attr('data-item_no'); var uitemNo = $target.attr('data-uitem_no'); var uitemName = $target.attr('data-uitem_name'); var giftItemNo = $target.attr('data-giftitem_no'); var giftLowerVendNo = $target.attr('data-giftlowervend_no'); var $optionItem = $target.closest('[data-giftitem]'); var $selectName = $optionItem.find('[data-option-selectname]'); var $optionviewLists = $optionItem.find('[data-optionview-list]'); var $activeChilds = $optionviewLists.find('li').filter('[data-uitem_no="' + uitemNo + '"]'); for (var i = 0, max = $activeChilds.length; i < max; i++) { var $activeChild = $activeChilds.eq(i); $activeChild.siblings().removeClass('selected'); } $activeChilds.addClass('selected'); $optionItem.attr('data-selected-value', uitemNo); $selectName.text(uitemName); var props = { itemNo: itemNo, giftValue: uitemName, gift: { itemNo: giftItemNo, uitemNo: uitemNo, lowerVendNo: giftLowerVendNo } }; if (this.lastItemData != null) { props = Util.def({}, this.lastItemData, props); this.lastItemData = null; } _this.product[_this.product.state].gift.run(props); }, optionSoldoutcheck: function ($el) { var checked = $el.prop('checked'); var $target = $el.closest('[data-options-flex]'); var $targetList = $target.find('[data-optionview-list]'); var $targetChilds = $targetList.find('>.sold_out'); if (checked) { $el.attr('checked', 'checked'); $targetChilds.hide(); } else { $el.removeAttr('checked'); $targetChilds.css('display', ''); } } } }); }, buildFocusItem: function () { var _this = this; var classAttr = this.opts.classAttr; Util.def(this, { focustoggle: { destroy: function () { var childs = _this.$el.find(_this.opts.toggleBtn); for (var i = 0, max = childs.length; i < max; i++) { var child = childs.eq(i); this.leave(child.parent(_this.opts.toggleList)); } }, leave: function (el) { if (!AllLayer.stateAttr.opened) { el.removeClass(classAttr.active); el.off('focusoutside mousedownoutside'); el.removeData('outsideEvent'); } }, enter: function (el) { var f = this; if (el.data('outsideEvent') == isUndefined) { el.data('outsideEvent', 'true'); el.addClass(classAttr.active); el.on('focusoutside mousedownoutside', function (e) { var ot = $(e.currentTarget); f.leave(ot); }); } }, click: function (el) { var child = el.parent(_this.opts.toggleList); if (child.hasClass(classAttr.disabled)) return; if (child.data('outsideEvent') == isUndefined) { this.enter(child); } else { this.leave(child); } } } }); }, changeEvents: function (event) { var events = [], eventNames = event.split(' '); for (var key in eventNames) { events.push(eventNames[key] + this.opts.customEvent); } return events.join(' '); }, bindEvents: function (type) { if (type) { this.$el.on(this.changeEvents('click'), '[data-optionitem] [data-optionview-list] a', this.itemClick.bind(this)); this.$el.on(this.changeEvents('change'), '[data-optionitem] [data-optionview-list] input', this.itemChange.bind(this)); this.$el.on(this.changeEvents('click'), '[data-optionitem] [data-calendar-active]', this.calClick.bind(this)); this.$el.on(this.changeEvents('click'), '[data-compositionitem] [data-optionview-list] a', this.compositionItemClick.bind(this)); this.$el.on(this.changeEvents('click'), '[data-giftitem] [data-optionview-list] a', this.giftClick.bind(this)); this.$el.on(this.changeEvents('change'), '[data-optionsoldout-check]', this.optionSoldoutChange.bind(this)); this.$el.on(this.changeEvents('click'), this.opts.toggleBtn, this.toggleFunc.bind(this)); this.$el.on(this.changeEvents('change'), '[data-jw-text]', this.jwtextChange.bind(this)); this.$el.on(this.changeEvents('click'), '[data-jw-push]', this.jwpushClick.bind(this)); } else { this.$el.off(this.changeEvents('click')); this.$el.off(this.changeEvents('change')); } }, itemClick: function (e) { e.preventDefault(); if (this.loader.options.state) return; var $t = $(e.currentTarget); var $child = $t.closest('li'); if ($child.hasClass('sold_out')) return; var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); if ($parentList.hasClass('active')) { $toggleActive.trigger('click'); } if ($child.attr('data-jw-option') != isUndefined) { if ($child.attr('data-option_length') == 'undefined') { this.methods.jwformhide($parentList); this.methods.itemcheck($t); } else { this.outCallback('selectedBefore'); this.methods.jwformshow($t); } } else { this.outCallback('selectedBefore'); this.methods.itemcheck($t); } }, itemChange: function (e) { if (this.loader.options.state) return; var $t = $(e.currentTarget); this.outCallback('selectedBefore'); this.methods.itemcheck($t); }, calClick: function (e) { e.preventDefault(); var classAttr = this.opts.classAttr; var $t = $(e.currentTarget); var $child = $t.closest('li'); if ($child.hasClass('sold_out')) return; var $parentList = $t.closest('[data-toggle-list]'); if ($parentList.hasClass(classAttr.disabled)) return; this.calendar.open({ $target: $t }); }, compositionItemClick: function (e) { e.preventDefault(); var $t = $(e.currentTarget); var $child = $t.closest('li'); if ($child.hasClass('sold_out')) return; var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); if ($parentList.hasClass('active')) { $toggleActive.trigger('click'); } this.outCallback('selectedBefore'); this.methods.compositionitemcheck($t); }, giftClick: function (e) { e.preventDefault(); if (this.loader.options.state) return; var $t = $(e.currentTarget); var $child = $t.closest('li'); if ($child.hasClass('sold_out')) return; var $parentList = $t.closest('[data-toggle-list]'); var $toggleActive = $parentList.find('>[data-toggle-active]'); if ($parentList.hasClass('active')) { $toggleActive.trigger('click'); } this.outCallback('selectedBefore'); this.methods.giftcheck($t); }, optionSoldoutChange: function (e) { if (this.loader.options.state) return; var $t = $(e.currentTarget); this.methods.optionSoldoutcheck($t); }, toggleFunc: function (e) { e.preventDefault(); var target = $(e.currentTarget); this.focustoggle.click(target); }, jwtextChange: function (e) { var $t = $(e.currentTarget); $t.attr('value', $t.val()); // console.log($t); }, jwpushClick: function (e) { e.preventDefault(); var $t = $(e.currentTarget); var $child = $t.closest('[data-optionitem]'); var $jwTxt = $child.find('[data-jw-text]'); var tit = $child.attr('data-itemoptiontype_name'); var jwVal = $jwTxt.val(); if (jwVal.length) { this.outCallback('selectedBefore'); this.methods.jwcheck($t); } else { win.alert(tit + ' 문구를 입력해 주세요.'); if (this.product.state == 'alone') { this.product[this.product.state].prices.aloneDatas.reset(); } $child.removeAttr('data-selected-text'); win.setTimeout(function () { $jwTxt.focus(); }, 10); } }, reset: function () { this.product.initialize(); this.loader.destroy(); }, destroy: function () { this.bindEvents(false); this.focustoggle.destroy(); this.loader.destroy(); this.product.destroy(); var $compositions = this.$optionSection.find('[data-composition_idx]'); $compositions.not(this.$basicOptionWrap).remove(); this.$basicOptionWrap.empty(); this.$basicGiftWrap.empty().hide(); this.$selectOptionWrap.empty().hide(); this.$priceOptionWrap.hide(); }, outCallback: function (ing, props) { var callbackObj = this.opts.on[ing]; if (callbackObj == null) return; callbackObj(props); } }; return Component; })(); return Component; })); (function (global, factory) { global = global; global.itemDetailRelation = factory(); }(this, function () { 'use strict'; var Component = (function (isUndefined) { var win = window, $ = win.jQuery, Util = win.EB.util; function Component (container, args) { var defParams = { inner: '.cp-detail-relation__inner', itemNo: null, lowerVendNo: null, itemCompositionDcode: null, customEvent: '.Component' + (new Date()).getTime() + Math.random(), }; this.opts = Util.def(defParams, (args || {})); if (!(this.obj = $(container)).length) return; this.init(); }; Component.prototype = { init: function () { if (this.opts.itemNo != null) { this.setElements(); this.buildLayout(); this.buildParams(); this.buildScrollTarget(); } }, setElements: function () { this.$inner = this.obj.find(this.opts.inner); }, buildLayout: function () { var _this = this; Util.def(this, { layout: { getSlide: function (prop) { var layout = []; layout.push(win.MacroUiItem(prop.data, { wrapTag: 'div', div: 'ui-item', height: '260', itemInfo: 'Y', priceInfoDetails: {orgSellprice: 'Y', sellprice: 'Y', finalDcPrice: 'Y', dcRate: 'Y'}, wish: 'Y', squareThumb: 'Y', badge: 'Y', icon: 'Y', newCommingSoon: '', sellingpoint: 'Y', maxmembers: 'Y' })); layout.unshift('
          • '); layout.push('
          • '); return layout.join(''); }, getSlides: function (props) { var datas = props.datas; var layout = []; datas.forEach(function (data, idx) { layout.push(this.getSlide({ data: data, idx: idx })); }.bind(this)); return layout.join(''); }, getWrapper: function () { var layout = []; layout.push('
            '); layout.push('
            '); layout.push('
            '); layout.push('
            '); layout.push('
            '); layout.push('이전으로'); layout.push('다음으로'); layout.push('
            '); return layout.join(''); }, build: function (items) { if (items.length) { _this.obj.css({ 'height': '', 'opacity': '' }); var getWrapper = this.getWrapper(); var $wrapper = $(getWrapper); var getSlides = this.getSlides({ datas: items }); var $getSlides = $(getSlides); $wrapper.find('.swiper-wrapper').append($getSlides); _this.$inner.append($wrapper); Util.page.rerun({ target: _this.$inner }); } else { _this.obj.hide(); } } } }); }, buildParams: function () { var _this = this; Util.def(this, { params: { getApi: function () { var deferred = $.Deferred(); eAjax.get({ url: ApiDomain.www + '/api/i/item/associationitems/' + _this.opts.itemNo, data: { lowerVendNo: _this.opts.lowerVendNo, itemCompositionDcode: _this.opts.itemCompositionDcode }, }).done(function (response) { deferred.resolve(response); }).fail(function () { deferred.reject(); }); return deferred.promise(); } } }); }, buildScrollTarget: function () { var _this = this; Util.def(this, { scrolltarget: { instance: null, destroy: function () { if (this.instance == null) return; this.instance.destroy(); this.instance = null; }, build: function () { this.instance = new ScrollTarget(_this.obj, { on: { complete: function () { _this.params.getApi().done(function (response) { _this.layout.build(response.data); }); } } }); } } }); this.scrolltarget.build(); }, destroy: function () { this.scrolltarget.destroy(); } }; return Component; })(); return Component; })); (function () { $(function () { var win = window; var doc = win.document; var couponsForItemDetail = { init: function () { this.setElements(); this.buildAwaitLoader(); this.buildLayout(); this.bindEvents(); }, setElements: function () { this.$body = $('body'); }, buildAwaitLoader: function () { var _this = this; gUtil.def(this, { awaitloader: { instance: null, destroy: function () { if (this.instance == null) return; this.instance.destroy(); this.instance = null; }, build: function () { this.destroy(); this.instance = new AwaitLoader(_this.$body); } } }); }, buildLayout: function () { var $body = this.$body; let downloadableQty = 0; let issuablePromNos = []; gUtil.def(this, { layout: { getCpnLayer: function () { var $layer = $('#DownCouponList'); if (!$layer.length) { var layouts = []; layouts.push(''); var $layout = $(layouts.join('')); $body.append($layout); $layer = $layout; new CmLayer($layer); } return $layer; }, getPromotion: function (prom) { if ('배송비쿠폰' === prom.promKindGroupName && '10' !== prom.shipTakebackDcode) { return; } var layouts = []; let benefitValue = prom.benefitValue; // 혜택값구분코드(PR0018) 율(10) 금액(20) if ("20" === prom.benefitValueDcode) { benefitValue = DGDUtil.addComma(benefitValue); } let issuable = prom.couponDownloadAvailQty > 0; layouts.push('
          • '); layouts.push('
            '); layouts.push('
            '); layouts.push('' + benefitValue + '' + (prom.benefitValueDcode === "20" ? '원' : '%') + ''); layouts.push('' + prom.promName + ''); let minValue = 0; let maxDcAmount = prom.maxDcAmount; if ("10" === prom.promApplyLevelTcode) { // 상품단위할인 // Mini_Item_Sell_UnitPrice 이상 사용가능 // sellPrice >= Mini_Item_Sell_UnitPrice 일시 사용가능 if (prom.miniItemSellUnitprice > 0) { minValue = prom.miniItemSellUnitprice; } } else if ("20" === prom.promApplyLevelTcode) { // 주문단위할인 // miniOrdAmount 이상 사용가능 if (prom.miniOrdAmount > 0) { minValue = prom.miniOrdAmount; } if ("배송비쿠폰" === prom.promKindGroupName) { maxDcAmount = prom.maxShipcostAmount; } } // 혜택 조건 // minValue 이상 구매 시 let couponInfoLayouts = []; if (minValue) { minValue = this.formatAmount(minValue); couponInfoLayouts.push('' + minValue + '원 이상 구매 시' + ''); } // 최대 maxValue 할인 let maxValue = 0; if (0 < maxDcAmount && maxDcAmount < 99999999) { maxValue = this.formatAmount(maxDcAmount); } if (maxValue) { couponInfoLayouts.push('' + '최대 ' + maxValue + '원 할인' + ''); } // coupon_issue_limit_qty_dcode 무제한(00 or null) / 개인별(10) let individual = ''; if ("10" === prom.couponIssueLimitQtyDcode) { let limitQtyPerId = prom.couponIssueLimitQty; individual = 'ID당 ' + limitQtyPerId + '장'; } if (individual) { const len = couponInfoLayouts.length; if (couponInfoLayouts.length) { couponInfoLayouts[len - 1] = couponInfoLayouts[len - 1].replace('', individual + ''); } else { couponInfoLayouts.push('' + individual + ''); } } if (couponInfoLayouts.length) { layouts.push(...couponInfoLayouts); } layouts.push('' + prom.promStartDate + '~' + prom.promEndDate + ''); layouts.push('
            '); layouts.push(''); layouts.push(''); layouts.push('' + (issuable ? "받기" : "발급완료") + ''); layouts.push(''); layouts.push(''); // prom_media_tcode 프로모션매체유형코드(PR0031) 00공통 10PC 30MOBILE 40APP if (prom.promMediaTcode === "40") { layouts.push('APP'); } layouts.push('
            '); layouts.push('
          • '); if (issuable) { downloadableQty += 1; issuablePromNos.push(prom.promNo); } return layouts.join(''); }, getPromotions: function (promotions) { downloadableQty = 0; issuablePromNos = []; let layouts = []; const groupedByPromKindGroupName = promotions.reduce((acc, prom) => { const promKindGroupName = prom.promKindGroupName; if (!acc[promKindGroupName]) { acc[promKindGroupName] = []; } acc[promKindGroupName].push(prom); return acc; }, {}); Object.entries(groupedByPromKindGroupName).forEach(([promKindGroupName, promotions]) => { layouts.push('
            ' + promKindGroupName + '
              '); promotions.forEach(prom => { layouts.push(this.getPromotion(prom)); }); layouts.push('
            '); }); return layouts.join(''); }, formatAmount: function (amount) { if (amount < 10000) { return DGDUtil.addComma(amount); } return (amount.toFixed(1) / 10000) + "만"; }, build: function (data) { const $cpnLayer = this.getCpnLayer(); const $appendWrap = $cpnLayer.find('.inner-scroll__wrap'); const $downloadAllButtons = $cpnLayer.find('[data-download-all-coupons]'); const $cpnDesc = $cpnLayer.find('#couponDesc'); const $cpnAllBtn = $cpnLayer.find('.mypage-box-btn .btn_type_black'); $cpnAllBtn.off('coupondown.done').on('coupondown.done', function (params) { var $cpnBtn = $(params.currentTarget); var $openLayer = $cpnBtn.closest('#DownCouponList'); $openLayer.trigger('closeLayer'); }); if (!Array.isArray(data) || !data.length) { $cpnDesc.hide(); $appendWrap.find('.coupon-list__wrap').remove(); $appendWrap.prepend($('

            적용 가능한 쿠폰이 없습니다.

            ')); } else { const promotions = this.getPromotions(data); const $promotions = $(promotions); $cpnDesc.css('display', ''); $appendWrap.find('.coupon-list__wrap').remove(); $appendWrap.prepend($promotions); let $btnTypeBlack = $downloadAllButtons.parent(); $btnTypeBlack.attr('data-login-promise', getLoginPromiseData("coupon")); $btnTypeBlack.attr('data-prom-no', issuablePromNos.join(',')); $downloadAllButtons.text(downloadableQty + '건 전체 받기'); } win.setTimeout(function () { $cpnLayer.trigger('openLayer'); }, 0); } } }) }, bindEvents: function () { $(doc).on('click', '[data-select-coupons]', this.couponsClick.bind(this)); }, couponsClick: function (e) { e.preventDefault(); var $t = $(e.currentTarget); var _itemNo = $t.data('itemno'); var _lowervendNo = $t.data('lowervendno'); var _manualapplycouponpossYn = $t.data('manualapplycoupon_poss_yn'); var complete = function () { this.awaitloader.destroy(); }.bind(this); this.awaitloader.build(); let url = itemApis.prefix.couponApi.replace("{itemNo}", _itemNo).replace("{lowerVendNo}", _lowervendNo); eAjax.get({ url: url, data: { manualApplyCouponPossYn: _manualapplycouponpossYn, }, complete: function () { complete(); }, }).done(function (response) { if (response.resultCode === "200") { this.layout.build(response.data.promotions); } }.bind(this)); }, }; couponsForItemDetail.init(); }); })();